streamrip/tests/test_config.py

294 lines
8.8 KiB
Python

import os
import shutil
import pytest
import tomlkit
from streamrip.config import (
ArtworkConfig,
CliConfig,
Config,
ConfigData,
ConversionConfig,
DatabaseConfig,
DeezerConfig,
DownloadsConfig,
FilepathsConfig,
LastFmConfig,
MetadataConfig,
MiscConfig,
QobuzConfig,
QobuzDiscographyFilterConfig,
SoundcloudConfig,
TidalConfig,
YoutubeConfig,
_get_dict_keys_r,
_nested_set,
update_config,
)
SAMPLE_CONFIG = "tests/test_config.toml"
OLD_CONFIG = "tests/test_config_old.toml"
# Define a fixture to create a sample ConfigData instance for testing
@pytest.fixture()
def sample_config_data() -> ConfigData:
# Create a sample ConfigData instance here
# You can customize this to your specific needs for testing
with open(SAMPLE_CONFIG) as f:
config_data = ConfigData.from_toml(f.read())
return config_data
# Define a fixture to create a sample Config instance for testing
@pytest.fixture()
def sample_config() -> Config:
# Create a sample Config instance here
# You can customize this to your specific needs for testing
config = Config(SAMPLE_CONFIG)
return config
def test_get_keys_r():
d = {
"key1": {
"key2": {
"key3": 1,
"key4": 1,
},
"key6": [1, 2],
5: 1,
}
}
res = _get_dict_keys_r(d)
print(res)
assert res == {
("key1", "key2", "key3"),
("key1", "key2", "key4"),
("key1", "key6"),
("key1", 5),
}
def test_safe_set():
d = {
"key1": {
"key2": {
"key3": 1,
"key4": 1,
},
"key6": [1, 2],
5: 1,
}
}
_nested_set(d, "key1", "key2", "key3", val=5)
assert d == {
"key1": {
"key2": {
"key3": 5,
"key4": 1,
},
"key6": [1, 2],
5: 1,
}
}
def test_config_update():
old = {
"downloads": {"folder": "some_path", "use_service": True},
"qobuz": {"email": "asdf@gmail.com", "password": "test"},
"legacy_conf": {"something": 1, "other": 2},
}
new = {
"downloads": {"folder": "", "use_service": False, "keep_artwork": True},
"qobuz": {"email": "", "password": ""},
"tidal": {"email": "", "password": ""},
}
update_config(old, new)
assert new == {
"downloads": {"folder": "some_path", "use_service": True, "keep_artwork": True},
"qobuz": {"email": "asdf@gmail.com", "password": "test"},
"tidal": {"email": "", "password": ""},
}
def test_config_throws_outdated():
with pytest.raises(Exception, match="update"):
_ = Config(OLD_CONFIG)
def test_config_file_update():
tmp_conf = "tests/test_config_old2.toml"
shutil.copy("tests/test_config_old.toml", tmp_conf)
Config._update_file(tmp_conf, SAMPLE_CONFIG)
with open(tmp_conf) as f:
s = f.read()
toml = tomlkit.parse(s) # type: ignore
assert toml["downloads"]["folder"] == "old_value" # type: ignore
assert toml["downloads"]["source_subdirectories"] is True # type: ignore
assert toml["downloads"]["concurrency"] is True # type: ignore
assert toml["downloads"]["max_connections"] == 6 # type: ignore
assert toml["downloads"]["requests_per_minute"] == 60 # type: ignore
assert toml["cli"]["text_output"] is True # type: ignore
assert toml["cli"]["progress_bars"] is True # type: ignore
assert toml["cli"]["max_search_results"] == 100 # type: ignore
assert toml["misc"]["version"] == "2.0.6" # type: ignore
assert "YouTubeVideos" in str(toml["youtube"]["video_downloads_folder"])
# type: ignore
os.remove("tests/test_config_old2.toml")
def test_sample_config_data_properties(sample_config_data):
# Test the properties of ConfigData
assert sample_config_data.modified is False # Ensure initial state is not modified
def test_sample_config_data_modification(sample_config_data):
# Test modifying ConfigData and checking modified property
sample_config_data.set_modified()
assert sample_config_data._modified is True
def test_sample_config_data_fields(sample_config_data):
test_config = ConfigData(
toml=None, # type: ignore
downloads=DownloadsConfig(
folder="test_folder",
source_subdirectories=False,
disc_subdirectories=True,
concurrency=True,
max_connections=6,
requests_per_minute=60,
),
qobuz=QobuzConfig(
use_auth_token=False,
email_or_userid="test@gmail.com",
password_or_token="test_pwd",
app_id="12345",
quality=3,
download_booklets=True,
secrets=["secret1", "secret2"],
),
tidal=TidalConfig(
user_id="userid",
country_code="countrycode",
access_token="accesstoken",
refresh_token="refreshtoken",
token_expiry="tokenexpiry",
quality=3,
download_videos=True,
),
deezer=DeezerConfig(
arl="testarl",
quality=2,
use_deezloader=True,
deezloader_warnings=True,
),
soundcloud=SoundcloudConfig(
client_id="clientid",
app_version="appversion",
quality=0,
),
youtube=YoutubeConfig(
video_downloads_folder="videodownloadsfolder",
quality=0,
download_videos=False,
),
lastfm=LastFmConfig(source="qobuz", fallback_source=""),
filepaths=FilepathsConfig(
add_singles_to_folder=False,
folder_format="{albumartist} - {title} ({year}) [{container}] [{bit_depth}B-{sampling_rate}kHz]",
track_format="{tracknumber}. {artist} - {title}{explicit}",
restrict_characters=False,
truncate_to=120,
),
artwork=ArtworkConfig(
embed=True,
embed_size="large",
embed_max_width=-1,
save_artwork=True,
saved_max_width=-1,
),
metadata=MetadataConfig(
set_playlist_to_album=True,
renumber_playlist_tracks=True,
exclude=[],
),
qobuz_filters=QobuzDiscographyFilterConfig(
extras=False,
repeats=False,
non_albums=False,
features=False,
non_studio_albums=False,
non_remaster=False,
),
cli=CliConfig(
text_output=False,
progress_bars=False,
max_search_results=100,
),
database=DatabaseConfig(
downloads_enabled=True,
downloads_path="downloadspath",
failed_downloads_enabled=True,
failed_downloads_path="faileddownloadspath",
),
conversion=ConversionConfig(
enabled=False,
codec="ALAC",
sampling_rate=48000,
bit_depth=24,
lossy_bitrate=320,
),
misc=MiscConfig(version="2.0", check_for_updates=True),
_modified=False,
)
assert sample_config_data.downloads == test_config.downloads
assert sample_config_data.qobuz == test_config.qobuz
assert sample_config_data.tidal == test_config.tidal
assert sample_config_data.deezer == test_config.deezer
assert sample_config_data.soundcloud == test_config.soundcloud
assert sample_config_data.youtube == test_config.youtube
assert sample_config_data.lastfm == test_config.lastfm
assert sample_config_data.artwork == test_config.artwork
assert sample_config_data.filepaths == test_config.filepaths
assert sample_config_data.metadata == test_config.metadata
assert sample_config_data.qobuz_filters == test_config.qobuz_filters
assert sample_config_data.database == test_config.database
assert sample_config_data.conversion == test_config.conversion
def test_config_update_on_save():
tmp_config_path = "tests/config2.toml"
shutil.copy(SAMPLE_CONFIG, tmp_config_path)
conf = Config(tmp_config_path)
conf.file.downloads.folder = "new_folder"
conf.file.set_modified()
conf.save_file()
conf2 = Config(tmp_config_path)
os.remove(tmp_config_path)
assert conf2.session.downloads.folder == "new_folder"
def test_config_dont_update_without_set_modified():
tmp_config_path = "tests/config2.toml"
shutil.copy(SAMPLE_CONFIG, tmp_config_path)
conf = Config(tmp_config_path)
conf.file.downloads.folder = "new_folder"
del conf
conf2 = Config(tmp_config_path)
os.remove(tmp_config_path)
assert conf2.session.downloads.folder == "test_folder"
# Other tests for the Config class can be added as needed
if __name__ == "__main__":
pytest.main()