Browse Source

Added (partial) test for 'currentAvailableIntents'.

part of CURA-6091
Remco Burema 5 years ago
parent
commit
e8a1c68d92
2 changed files with 76 additions and 10 deletions
  1. 3 5
      cura/Settings/IntentManager.py
  2. 73 5
      tests/TestIntentManager.py

+ 3 - 5
cura/Settings/IntentManager.py

@@ -1,13 +1,10 @@
 #Copyright (c) 2019 Ultimaker B.V.
 #Cura is released under the terms of the LGPLv3 or higher.
 
-from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal
+from PyQt5.QtCore import QObject, pyqtSignal
 from typing import Any, Dict, List, Set, Tuple, TYPE_CHECKING
 from cura.CuraApplication import CuraApplication
-from cura.Machines.QualityManager import QualityManager
 from cura.Settings.ExtruderManager import ExtruderManager
-from cura.Settings.MachineManager import MachineManager
-from UM.Settings.ContainerRegistry import ContainerRegistry
 from UM.Settings.InstanceContainer import InstanceContainer
 
 if TYPE_CHECKING:
@@ -75,7 +72,8 @@ class IntentManager(QObject):
         if global_stack is None:
             return [("default", "normal")]
         quality_groups = application.getQualityManager().getQualityGroups(global_stack)
-        available_quality_types = {quality_group.quality_type for quality_group in quality_groups if quality_group.node_for_global is not None}
+        available_quality_types = {quality_group.quality_type for quality_group in quality_groups.values() if quality_group.node_for_global is not None}
+        # available_quality_types could just be 'quality_group.keys()', except for that the node_for_global may be None
 
         final_intent_ids = set() #type: Set[str]
         current_definition_id = global_stack.definition.getMetaDataEntry("id")

+ 73 - 5
tests/TestIntentManager.py

@@ -1,24 +1,45 @@
 from unittest.mock import MagicMock, patch
 
 import pytest
+from typing import Any, Dict, List
 
 from cura.Settings.IntentManager import IntentManager
+from cura.Machines.QualityGroup import QualityGroup
+from cura.Machines.QualityManager import QualityManager
+
+from tests.Settings.MockContainer import MockContainer
 
 @pytest.fixture()
-def intent_manager(application, extruder_manager, machine_manager, container_registry, global_stack) -> IntentManager:
+def quality_manager(application, container_registry, global_stack) -> QualityManager:
+    application.getGlobalContainerStack = MagicMock(return_value = global_stack)
+    with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value=application)):
+        with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)):
+            manager = QualityManager(application)
+    return manager
+
+
+@pytest.fixture()
+def intent_manager(application, extruder_manager, machine_manager, quality_manager, container_registry, global_stack) -> IntentManager:
     application.getExtruderManager = MagicMock(return_value = extruder_manager)
     application.getGlobalContainerStack = MagicMock(return_value = global_stack)
     application.getMachineManager = MagicMock(return_value = machine_manager)
+    application.getQualityManager = MagicMock(return_value = quality_manager)
     with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value=application)):
         with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)):
             manager = IntentManager()
-
     return manager
 
+
+mocked_intent_metadata = [
+    {"id": "um3_aa4_pla_smooth_normal", "GUID": "abcxyz", "definition": "ultimaker3", "variant": "AA 0.4",
+     "material_id": "generic_pla", "intent_category": "smooth", "quality_type": "normal"},
+    {"id": "um3_aa4_pla_strong_abnorm", "GUID": "defqrs", "definition": "ultimaker3", "variant": "AA 0.4",
+     "material_id": "generic_pla", "intent_category": "strong", "quality_type": "abnorm"}]  # type:List[Dict[str, str]]
+
+
 def test_intentCategories(application, intent_manager, container_registry):
-    mocked_metadata = [{"id": "um3_aa4_pla_smooth", "GUID": "abcxyz", "definition": "ultimaker3", "variant": "AA 0.4", "material_id": "generic_pla", "intent_category": "smooth"},
-                       {"id": "um3_aa4_pla_strong", "GUID": "defqrs", "definition": "ultimaker3", "variant": "AA 0.4", "material_id": "generic_pla", "intent_category": "strong"}]
-    container_registry.findContainersMetadata = MagicMock(return_value=mocked_metadata)
+    # Mock .findContainersMetadata so we also test .intentMetadatas (the latter is mostly a wrapper around the former).
+    container_registry.findContainersMetadata = MagicMock(return_value=mocked_intent_metadata)
 
     with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value=application)):
         with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)):
@@ -26,3 +47,50 @@ def test_intentCategories(application, intent_manager, container_registry):
             assert "default" in categories, "default should always be in categories"
             assert "strong" in categories, "strong should be in categories"
             assert "smooth" in categories, "smooth should be in categories"
+
+
+def test_currentAvailableIntents(application, extruder_manager, quality_manager, intent_manager, container_registry):
+    mocked_qualitygroup_metadata = {
+        "normal": QualityGroup("um3_aa4_pla_normal", "normal"),
+        "abnorm": QualityGroup("um3_aa4_pla_abnorm", "abnorm")}  # type:Dict[str, QualityGroup]
+
+    def mockIntentMetadatas(**kwargs) -> List[Dict[str, Any]]:
+        if "id" in kwargs:
+            return [x for x in mocked_intent_metadata if x["id"] == kwargs["id"]]
+        else:
+            # TODO? switch on 'kwargs["definition_id"]', "nozzle_name", "material_id" -> ... or go 1 deeper
+            return mocked_intent_metadata
+    container_registry.findContainersMetadata = MagicMock(side_effect=mockIntentMetadatas)
+
+    quality_manager.getQualityGroups = MagicMock(return_value=mocked_qualitygroup_metadata)
+    for _, qualitygroup in mocked_qualitygroup_metadata.items():
+        qualitygroup.node_for_global = MagicMock(name="Node for global")
+    application.getQualityManager = MagicMock(return_value=quality_manager)
+
+    extruder_stack_a = MockContainer({"id": "A"})
+    extruder_stack_a.variant = MockContainer({"id": "A_variant"})
+    extruder_stack_a.material = MockContainer({"id": "A_material"})
+    extruder_stack_b = MockContainer({"id": "B"})
+    extruder_stack_b.variant = MockContainer({"id": "B_variant"})
+    extruder_stack_b.material = MockContainer({"id": "B_material"})
+    # See previous TODO, the above doesn't really matter if intentmetadatas is mocked out the way it is, but it should.
+
+    extruder_manager.getUsedExtruderStacks = MagicMock(return_value=[extruder_stack_a, extruder_stack_b])
+
+    with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value=application)):
+        with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)):
+            with patch("cura.Settings.ExtruderManager.ExtruderManager.getInstance", MagicMock(return_value=extruder_manager)):
+                intents = intent_manager.currentAvailableIntents()
+                assert ("smooth", "normal") in intents
+                assert ("strong", "abnorm") in intents
+                assert len(intents) == 2
+
+
+def test_currentAvailableIntentCategories(application, quality_manager, intent_manager, container_registry):
+    # def currentAvailableIntentCategories(self) -> List[str]:
+    pass
+
+
+def test_selectIntent(application, intent_manager, container_registry):
+    # def selectIntent(self, intent_category, quality_type) -> None:
+    pass