diff --git a/.gitignore b/.gitignore index bba1005d8..cbf795afb 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ *.exe *.dll .data +!/tests/cogs/dataconverter/data/**/*.json ### JetBrains template # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm diff --git a/redbot/cogs/dataconverter/core_specs.py b/redbot/cogs/dataconverter/core_specs.py index 307466505..08cc2ce57 100644 --- a/redbot/cogs/dataconverter/core_specs.py +++ b/redbot/cogs/dataconverter/core_specs.py @@ -119,11 +119,10 @@ class SpecResolver(object): def past_nicknames_conv_spec(self, data: dict): flatscoped = self.apply_scope(Config.MEMBER, self.flatten_dict(data)) ret = {} - for k, v in flatscoped.items(): - outerkey, innerkey = (*k[:-1],), (k[-1],) - if outerkey not in ret: - ret[outerkey] = {} - ret[outerkey].update({innerkey: v}) + for config_identifiers, v2data in flatscoped.items(): + if config_identifiers not in ret: + ret[config_identifiers] = {} + ret[config_identifiers].update({("past_nicks",): v2data}) return ret def customcom_conv_spec(self, data: dict): @@ -144,18 +143,28 @@ class SpecResolver(object): ret[outerkey].update({innerkey: ccinfo}) return ret - async def convert(self, bot: Red, prettyname: str): - if prettyname not in self.available: - raise NotImplementedError("No Conversion Specs for this") - - info = self.available_core_conversions[prettyname] - filepath, converter = info["file"], info["converter"] - (cogname, attr, _id) = info["cfg"] + def get_config_object(self, bot, cogname, attr, _id): try: config = getattr(bot.get_cog(cogname), attr) except (TypeError, AttributeError): config = Config.get_conf(None, _id, cog_name=cogname) + return config + + def get_conversion_info(self, prettyname: str): + info = self.available_core_conversions[prettyname] + filepath, converter = info["file"], info["converter"] + (cogname, attr, _id) = info["cfg"] + return filepath, converter, cogname, attr, _id + + async def convert(self, bot: Red, prettyname: str, config=None): + if prettyname not in self.available: + raise NotImplementedError("No Conversion Specs for this") + + filepath, converter, cogname, attr, _id = self.get_conversion_info(prettyname) + if config is None: + config = self.get_config_object(bot, cogname, attr, _id) + try: items = converter(dc.json_load(filepath)) await dc(config).dict_import(items) diff --git a/tests/cogs/dataconverter/__init__.py b/tests/cogs/dataconverter/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/cogs/dataconverter/data/mod/past_nicknames.json b/tests/cogs/dataconverter/data/mod/past_nicknames.json new file mode 100644 index 000000000..f44b2c0d6 --- /dev/null +++ b/tests/cogs/dataconverter/data/mod/past_nicknames.json @@ -0,0 +1,26 @@ +{ + "1" : { + "1" : [ + "Test", + "Test2", + "TEST3" + ], + "2" : [ + "Test4", + "Test5", + "TEST6" + ] + }, + "2" : { + "1" : [ + "Test", + "Test2", + "TEST3" + ], + "2" : [ + "Test4", + "Test5", + "TEST6" + ] + } +} \ No newline at end of file diff --git a/tests/cogs/dataconverter/test_dataconverter.py b/tests/cogs/dataconverter/test_dataconverter.py new file mode 100644 index 000000000..59f04068a --- /dev/null +++ b/tests/cogs/dataconverter/test_dataconverter.py @@ -0,0 +1,39 @@ +import pytest +from pathlib import Path +from collections import namedtuple + +from redbot.cogs.dataconverter import core_specs +from redbot.core.utils.data_converter import DataConverter + + +def mock_dpy_object(id_): + return namedtuple("DPYObject", "id")(int(id_)) + + +def mock_dpy_member(guildid, userid): + return namedtuple("Member", "id guild")(int(userid), mock_dpy_object(guildid)) + + +@pytest.fixture() +def specresolver(): + here = Path(__file__) + + resolver = core_specs.SpecResolver(here.parent) + return resolver + + +@pytest.mark.asyncio +async def test_mod_nicknames(red, specresolver: core_specs.SpecResolver): + filepath, converter, cogname, attr, _id = specresolver.get_conversion_info("Past Nicknames") + conf = specresolver.get_config_object(red, cogname, attr, _id) + + v2data = DataConverter.json_load(filepath) + + await specresolver.convert(red, "Past Nicknames", config=conf) + + for guildid, guild_data in v2data.items(): + guild = mock_dpy_object(guildid) + for userid, user_data in guild_data.items(): + member = mock_dpy_member(guildid, userid) + + assert await conf.member(member).past_nicks() == user_data diff --git a/tests/cogs/test_alias.py b/tests/cogs/test_alias.py index 1c54d67f5..92f55bfbf 100644 --- a/tests/cogs/test_alias.py +++ b/tests/cogs/test_alias.py @@ -1,15 +1,14 @@ import pytest from redbot.cogs.alias import Alias +from redbot.core import Config @pytest.fixture() -def alias(config): - import redbot.cogs.alias.alias - - redbot.cogs.alias.alias.Config.get_conf = lambda *args, **kwargs: config - - return Alias(None) +def alias(config, monkeypatch): + with monkeypatch.context() as m: + m.setattr(Config, "get_conf", lambda *args, **kwargs: config) + return Alias(None) def test_is_valid_alias_name(alias): diff --git a/tests/cogs/test_economy.py b/tests/cogs/test_economy.py index 4d9b10993..9ecdacb2f 100644 --- a/tests/cogs/test_economy.py +++ b/tests/cogs/test_economy.py @@ -2,15 +2,15 @@ import pytest @pytest.fixture() -def bank(config): +def bank(config, monkeypatch): from redbot.core import Config - Config.get_conf = lambda *args, **kwargs: config + with monkeypatch.context() as m: + m.setattr(Config, "get_conf", lambda *args, **kwargs: config) + from redbot.core import bank - from redbot.core import bank - - bank._register_defaults() - return bank + bank._register_defaults() + return bank @pytest.mark.asyncio diff --git a/tests/cogs/test_mod.py b/tests/cogs/test_mod.py index fbe830dc1..7409b9916 100644 --- a/tests/cogs/test_mod.py +++ b/tests/cogs/test_mod.py @@ -2,15 +2,15 @@ import pytest @pytest.fixture -def mod(config): +def mod(config, monkeypatch): from redbot.core import Config - Config.get_conf = lambda *args, **kwargs: config + with monkeypatch.context() as m: + m.setattr(Config, "get_conf", lambda *args, **kwargs: config) + from redbot.core import modlog - from redbot.core import modlog - - modlog._register_defaults() - return modlog + modlog._register_defaults() + return modlog @pytest.mark.asyncio