diff --git a/test/formats/common.py b/test/formats/common.py index 52134c3f8..4e1900018 100644 --- a/test/formats/common.py +++ b/test/formats/common.py @@ -201,7 +201,7 @@ class CommonTests: def setUp(self): super().setUp() - config.setting = settings.copy() + self.set_config_values(settings) if self.testfile: _name, self.testfile_ext = os.path.splitext(self.testfile) self.testfile_path = os.path.join('test', 'data', self.testfile) diff --git a/test/picardtestcase.py b/test/picardtestcase.py index 8c9741478..85a2b19c7 100644 --- a/test/picardtestcase.py +++ b/test/picardtestcase.py @@ -3,7 +3,7 @@ # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2018 Wieland Hoffmann -# Copyright (C) 2019 Philipp Wolfer +# Copyright (C) 2019-2020 Philipp Wolfer # Copyright (C) 2020 Laurent Monin # # This program is free software; you can redistribute it and/or @@ -29,7 +29,9 @@ from tempfile import ( mkdtemp, mkstemp, ) +import threading import unittest +from unittest.mock import Mock from PyQt5 import QtCore @@ -72,7 +74,28 @@ class PicardTestCase(unittest.TestCase): self.tagger = FakeTagger() QtCore.QObject.tagger = self.tagger self.addCleanup(self.tagger.run_cleanup) - config.setting = {} + self.init_config() + + @staticmethod + def init_config(): + fake_config = Mock() + fake_config.setting = {} + fake_config.persist = {} + # Make config object available to current thread + config._thread_configs[threading.get_ident()] = fake_config + # Make config object available for legacy use + config.config = fake_config + config.setting = fake_config.setting + config.persist = fake_config.persist + + @staticmethod + def set_config_values(setting=None, persist=None): + if setting: + for key, value in setting.items(): + config.config.setting[key] = value + if persist: + for key, value in persist.items(): + config.config.persist[key] = value def mktmpdir(self, ignore_errors=False): tmpdir = mkdtemp(suffix=self.__class__.__name__) diff --git a/test/test_acoustid.py b/test/test_acoustid.py index 36068da4f..662d5393f 100644 --- a/test/test_acoustid.py +++ b/test/test_acoustid.py @@ -27,7 +27,6 @@ import os from test.picardtestcase import PicardTestCase -from picard import config from picard.acoustid.json_helpers import parse_recording from picard.mbjson import recording_to_metadata from picard.metadata import Metadata @@ -49,7 +48,7 @@ class AcoustIDTest(PicardTestCase): self.init_test(self.filename) def init_test(self, filename): - config.setting = settings.copy() + self.set_config_values(settings) self.json_doc = None with open(os.path.join('test', 'data', 'ws_data', filename), encoding='utf-8') as f: self.json_doc = json.load(f) diff --git a/test/test_acoustidmanager.py b/test/test_acoustidmanager.py index ea80862d2..f52f0e07c 100644 --- a/test/test_acoustidmanager.py +++ b/test/test_acoustidmanager.py @@ -27,7 +27,6 @@ from unittest.mock import ( from test.picardtestcase import PicardTestCase -from picard import config from picard.acoustid.manager import AcoustIDManager from picard.file import File @@ -55,10 +54,10 @@ def dummy_file(i): class AcoustIDManagerTest(PicardTestCase): def setUp(self): super().setUp() - config.setting = { + self.set_config_values({ "clear_existing_tags": False, "compare_ignore_tags": [] - } + }) self.mock_api_helper = MagicMock() self.mock_api_helper.submit_acoustid_fingerprints = Mock(wraps=mock_succeed_submission) self.acoustidmanager = AcoustIDManager(self.mock_api_helper) diff --git a/test/test_api_helpers.py b/test/test_api_helpers.py index 72f5af50d..c00c25ab5 100644 --- a/test/test_api_helpers.py +++ b/test/test_api_helpers.py @@ -26,7 +26,6 @@ from unittest.mock import MagicMock from test.picardtestcase import PicardTestCase -from picard import config from picard.webservice import WebService from picard.webservice.api_helpers import ( APIHelper, @@ -72,8 +71,9 @@ class APITest(PicardTestCase): class MBAPITest(PicardTestCase): def setUp(self): + super().setUp() self.config = {'server_host': "mb.org", "server_port": 443} - config.setting = self.config.copy() + self.set_config_values(self.config) self.ws = MagicMock(auto_spec=WebService) self.api = MBAPIHelper(self.ws) diff --git a/test/test_file.py b/test/test_file.py index c43a745bc..5cc37c4fa 100644 --- a/test/test_file.py +++ b/test/test_file.py @@ -171,7 +171,7 @@ class FileNamingTest(PicardTestCase): def setUp(self): super().setUp() self.file = File('/somepath/somefile.mp3') - config.setting = { + self.set_config_values({ 'ascii_filenames': False, 'clear_existing_tags': False, 'enabled_plugins': [], @@ -180,7 +180,7 @@ class FileNamingTest(PicardTestCase): 'move_files': False, 'rename_files': False, 'windows_compatibility': True, - } + }) self.metadata = Metadata({ 'album': 'somealbum', 'title': 'sometitle', diff --git a/test/test_filesystem.py b/test/test_filesystem.py index 91591d551..8c966a425 100644 --- a/test/test_filesystem.py +++ b/test/test_filesystem.py @@ -46,7 +46,7 @@ class TestFileSystem(PicardTestCase): super().setUp() self.src_directory = self.mktmpdir() self.tgt_directory = self.mktmpdir() - config.setting = settings.copy() + self.set_config_values(settings) def _prepare_files(self, src_rel_path='', tgt_rel_path=''): """Prepare src files and tgt filenames for a test.""" diff --git a/test/test_interface_colors.py b/test/test_interface_colors.py index 83546697c..e5e43fe5b 100644 --- a/test/test_interface_colors.py +++ b/test/test_interface_colors.py @@ -47,7 +47,7 @@ settings = { class InterfaceColorsTest(PicardTestCase): def setUp(self): super().setUp() - config.setting = settings.copy() + self.set_config_values(settings) def test_interface_colors(self): for key in ('interface_colors', 'interface_colors_dark'): diff --git a/test/test_mbjson.py b/test/test_mbjson.py index c31be083f..2adbf52ff 100644 --- a/test/test_mbjson.py +++ b/test/test_mbjson.py @@ -64,7 +64,7 @@ class MBJSONTest(PicardTestCase): self.init_test(self.filename) def init_test(self, filename): - config.setting = settings.copy() + self.set_config_values(settings) self.json_doc = load_test_json(filename) diff --git a/test/test_metadata.py b/test/test_metadata.py index a322f97e0..75a86a61b 100644 --- a/test/test_metadata.py +++ b/test/test_metadata.py @@ -29,7 +29,6 @@ from test.picardtestcase import ( ) from test.test_coverart_image import create_image -from picard import config from picard.cluster import Cluster from picard.coverart.image import CoverArtImage from picard.file import File @@ -74,7 +73,7 @@ class CommonTests: def setUp(self): super().setUp() - config.setting = settings.copy() + self.set_config_values(settings) self.metadata = self.get_metadata_object() self.metadata.length = 242 self.metadata["single1"] = "single1-value" diff --git a/test/test_releaseversions.py b/test/test_releaseversions.py index 1bfe33c8c..008bef06e 100644 --- a/test/test_releaseversions.py +++ b/test/test_releaseversions.py @@ -31,7 +31,6 @@ from test.picardtestcase import ( load_test_json, ) -from picard import config from picard.i18n import setup_gettext from picard.releasegroup import ReleaseGroup @@ -54,7 +53,7 @@ class ReleaseTest(PicardTestCase): setup_gettext(self.localedir, 'C') def test_1(self): - config.setting = settings.copy() + self.set_config_values(settings) rlist = load_test_json('release_group_2.json') r = ReleaseGroup(1) r._parse_versions(rlist) @@ -66,7 +65,7 @@ class ReleaseTest(PicardTestCase): '5 / 2009 / GB / CD / label A / cat 123 / Digipak / specialx') def test_2(self): - config.setting = settings.copy() + self.set_config_values(settings) rlist = load_test_json('release_group_3.json') r = ReleaseGroup(1) r._parse_versions(rlist) @@ -76,7 +75,7 @@ class ReleaseTest(PicardTestCase): '5 / 2011 / FR / CD / label A / cat 123') def test_3(self): - config.setting = settings.copy() + self.set_config_values(settings) rlist = load_test_json('release_group_4.json') r = ReleaseGroup(1) r._parse_versions(rlist) diff --git a/test/test_script.py b/test/test_script.py index 00e56315d..a719c1f0f 100644 --- a/test/test_script.py +++ b/test/test_script.py @@ -37,7 +37,6 @@ from unittest.mock import MagicMock from test.picardtestcase import PicardTestCase -from picard import config from picard.cluster import Cluster from picard.const import DEFAULT_FILE_NAMING_FORMAT from picard.metadata import ( @@ -106,9 +105,9 @@ class ScriptParserTest(PicardTestCase): def setUp(self): super().setUp() - config.setting = { + self.set_config_values({ 'enabled_plugins': '', - } + }) self.parser = ScriptParser() diff --git a/test/test_scripttofilename.py b/test/test_scripttofilename.py index 4789cbe30..f1f9ecb96 100644 --- a/test/test_scripttofilename.py +++ b/test/test_scripttofilename.py @@ -53,7 +53,7 @@ class ScriptToFilenameTest(PicardTestCase): def setUp(self): super().setUp() - config.setting = settings.copy() + self.set_config_values(settings) def test_plain_filename(self): metadata = Metadata() diff --git a/test/test_settingsoverride.py b/test/test_settingsoverride.py index 1ece9510b..ee19a1d39 100644 --- a/test/test_settingsoverride.py +++ b/test/test_settingsoverride.py @@ -28,8 +28,8 @@ from picard.util.settingsoverride import SettingsOverride class SettingsOverrideTest(PicardTestCase): def setUp(self): - self.config = {'key1': 'origval1', 'key2': 'origval2'} - config.setting = self.config.copy() + super().setUp() + self.set_config_values({'key1': 'origval1', 'key2': 'origval2'}) self.new_settings = {'key1': 'newval2'} def test_read_orig_settings(self): diff --git a/test/test_utils.py b/test/test_utils.py index ffece9548..7456f3e1f 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -388,6 +388,7 @@ SimMatchTest = namedtuple('SimMatchTest', 'similarity name') class SortBySimilarity(PicardTestCase): def setUp(self): + super().setUp() self.test_values = [ SimMatchTest(similarity=0.74, name='d'), SimMatchTest(similarity=0.61, name='a'), @@ -435,6 +436,7 @@ class GetQtEnum(PicardTestCase): class LimitedJoin(PicardTestCase): def setUp(self): + super().setUp() self.list = [str(x) for x in range(0, 10)] def test_1(self): diff --git a/test/test_webservice.py b/test/test_webservice.py index 69ef13bbe..5c1c50546 100644 --- a/test/test_webservice.py +++ b/test/test_webservice.py @@ -55,17 +55,13 @@ class WebServiceTest(PicardTestCase): def setUp(self): super().setUp() - config.setting = { + self.set_config_values({ 'use_proxy': False, 'server_host': '', 'network_transfer_timeout_seconds': 30, - } + }) self.ws = WebService() - def tearDown(self): - del self.ws - config.setting = {} - @patch.object(WebService, 'add_task') def test_webservice_method_calls(self, mock_add_task): host = "abc.xyz" @@ -97,20 +93,16 @@ class WebServiceTaskTest(PicardTestCase): def setUp(self): super().setUp() - config.setting = { + self.set_config_values({ 'use_proxy': False, 'network_transfer_timeout_seconds': 30, - } + }) self.ws = WebService() # Patching the QTimers since they can only be started in a QThread self.ws._timer_run_next_task = MagicMock() self.ws._timer_count_pending_requests = MagicMock() - def tearDown(self): - del self.ws - config.setting = {} - def test_add_task(self): mock_timer1 = self.ws._timer_run_next_task @@ -215,10 +207,7 @@ class WebServiceProxyTest(PicardTestCase): def setUp(self): super().setUp() - config.setting = PROXY_SETTINGS.copy() - - def tearDown(self): - config.setting = {} + self.set_config_values(PROXY_SETTINGS) def test_proxy_setup(self): proxy_types = [