diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 483150a75c..6e354a4c79 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -171,9 +171,6 @@ class CuraContainerRegistry(ContainerRegistry): if not file_name: return { "status": "error", "message": catalog.i18nc("@info:status Don't translate the XML tags !", "Failed to import profile from {0}: {1}", file_name, "Invalid path")} - plugin_registry = PluginRegistry.getInstance() - extension = file_name.split(".")[-1] - global_stack = Application.getInstance().getGlobalContainerStack() if not global_stack: return {"status": "error", "message": catalog.i18nc("@info:status Don't translate the XML tags !", "Can't import profile from {0} before a printer is added.", file_name)} @@ -182,6 +179,9 @@ class CuraContainerRegistry(ContainerRegistry): for position in sorted(global_stack.extruders): machine_extruders.append(global_stack.extruders[position]) + plugin_registry = PluginRegistry.getInstance() + extension = file_name.split(".")[-1] + for plugin_id, meta_data in self._getIOPlugins("profile_reader"): if meta_data["profile_reader"][0]["extension"] != extension: continue diff --git a/tests/Settings/TestCuraContainerRegistry.py b/tests/Settings/TestCuraContainerRegistry.py index 2c4816afed..06f3f581ba 100644 --- a/tests/Settings/TestCuraContainerRegistry.py +++ b/tests/Settings/TestCuraContainerRegistry.py @@ -6,6 +6,7 @@ import pytest #To parameterize tests. import unittest.mock #To mock and monkeypatch stuff. from UM.Settings.DefinitionContainer import DefinitionContainer +from cura.ReaderWriters.ProfileReader import NoProfileException from cura.Settings.ExtruderStack import ExtruderStack #Testing for returning the correct types of stacks. from cura.Settings.GlobalStack import GlobalStack #Testing for returning the correct types of stacks. import UM.Settings.InstanceContainer #Creating instance containers to register. @@ -222,9 +223,8 @@ class TestExportQualityProfile: def test__findProfileWriterNoPlugins(container_registry): # Mock it so that no IO plugins are found. container_registry._getIOPlugins = unittest.mock.MagicMock(return_value = []) - mocked_plugin_registry = unittest.mock.MagicMock(name = "plugin registry") - with unittest.mock.patch("UM.PluginRegistry.PluginRegistry.getInstance", mocked_plugin_registry): + with unittest.mock.patch("UM.PluginRegistry.PluginRegistry.getInstance"): # Since there are no writers, don't return any assert container_registry._findProfileWriter(".zomg", "dunno") is None @@ -232,8 +232,71 @@ def test__findProfileWriterNoPlugins(container_registry): def test__findProfileWriter(container_registry): # Mock it so that no IO plugins are found. container_registry._getIOPlugins = unittest.mock.MagicMock(return_value = [("writer_id", {"profile_writer": [{"extension": ".zomg", "description": "dunno"}]})]) - mocked_plugin_registry = unittest.mock.MagicMock(name = "plugin registry") - with unittest.mock.patch("UM.PluginRegistry.PluginRegistry.getInstance", mocked_plugin_registry): + with unittest.mock.patch("UM.PluginRegistry.PluginRegistry.getInstance"): # In this case it's getting a mocked object (from the mocked_plugin_registry) assert container_registry._findProfileWriter(".zomg", "dunno") is not None + + +def test_importProfileEmptyFileName(container_registry): + result = container_registry.importProfile("") + assert result["status"] == "error" + + +mocked_application = unittest.mock.MagicMock(name = "application") +mocked_plugin_registry = unittest.mock.MagicMock(name="mocked_plugin_registry") + +@unittest.mock.patch("UM.Application.Application.getInstance", unittest.mock.MagicMock(return_value = mocked_application)) +@unittest.mock.patch("UM.PluginRegistry.PluginRegistry.getInstance", unittest.mock.MagicMock(return_value = mocked_plugin_registry)) +class TestImportProfile: + mocked_global_stack = unittest.mock.MagicMock(name="global stack") + mocked_global_stack.extruders = {0: unittest.mock.MagicMock(name="extruder stack")} + mocked_global_stack.getId = unittest.mock.MagicMock(return_value="blarg") + mocked_profile_reader = unittest.mock.MagicMock() + + mocked_plugin_registry.getPluginObject = unittest.mock.MagicMock(return_value=mocked_profile_reader) + + def test_importProfileWithoutGlobalStack(self, container_registry): + mocked_application.getGlobalContainerStack = unittest.mock.MagicMock(return_value = None) + result = container_registry.importProfile("non_empty") + assert result["status"] == "error" + + def test_importProfileNoProfileException(self, container_registry): + container_registry._getIOPlugins = unittest.mock.MagicMock(return_value=[("reader_id", {"profile_reader": [{"extension": "zomg", "description": "dunno"}]})]) + mocked_application.getGlobalContainerStack = unittest.mock.MagicMock(return_value=self.mocked_global_stack) + self.mocked_profile_reader.read = unittest.mock.MagicMock(side_effect = NoProfileException) + result = container_registry.importProfile("test.zomg") + # It's not an error, but we also didn't find any profile to read. + assert result["status"] == "ok" + + def test_importProfileGenericException(self, container_registry): + container_registry._getIOPlugins = unittest.mock.MagicMock(return_value=[("reader_id", {"profile_reader": [{"extension": "zomg", "description": "dunno"}]})]) + mocked_application.getGlobalContainerStack = unittest.mock.MagicMock(return_value=self.mocked_global_stack) + self.mocked_profile_reader.read = unittest.mock.MagicMock(side_effect = Exception) + result = container_registry.importProfile("test.zomg") + assert result["status"] == "error" + + def test_importProfileNoDefinitionFound(self, container_registry): + container_registry._getIOPlugins = unittest.mock.MagicMock(return_value=[("reader_id", {"profile_reader": [{"extension": "zomg", "description": "dunno"}]})]) + mocked_application.getGlobalContainerStack = unittest.mock.MagicMock(return_value=self.mocked_global_stack) + container_registry.findDefinitionContainers = unittest.mock.MagicMock(return_value = []) + mocked_profile = unittest.mock.MagicMock(name = "Mocked_global_profile") + self.mocked_profile_reader.read = unittest.mock.MagicMock(return_value = [mocked_profile]) + + result = container_registry.importProfile("test.zomg") + assert result["status"] == "error" + + def test_importProfileSuccess(self, container_registry): + container_registry._getIOPlugins = unittest.mock.MagicMock(return_value=[("reader_id", {"profile_reader": [{"extension": "zomg", "description": "dunno"}]})]) + mocked_application.getGlobalContainerStack = unittest.mock.MagicMock(return_value=self.mocked_global_stack) + + mocked_definition = unittest.mock.MagicMock(name = "definition") + + container_registry.findDefinitionContainers = unittest.mock.MagicMock(return_value = [mocked_definition]) + mocked_profile = unittest.mock.MagicMock(name = "Mocked_global_profile") + + self.mocked_profile_reader.read = unittest.mock.MagicMock(return_value = [mocked_profile]) + with unittest.mock.patch.object(container_registry, "createUniqueName", return_value="derp"): + with unittest.mock.patch.object(container_registry, "_configureProfile", return_value=None): + result = container_registry.importProfile("test.zomg") + assert result["status"] == "ok" \ No newline at end of file