TestMachineNode.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. from unittest.mock import patch, MagicMock
  2. import pytest
  3. from UM.Settings.Interfaces import ContainerInterface
  4. from cura.Machines.MachineNode import MachineNode
  5. metadata_dict = {
  6. "has_materials": "false",
  7. "has_variants": "true",
  8. "has_machine_quality": "true",
  9. "quality_definition": "test_quality_definition",
  10. "exclude_materials": ["excluded_material_1", "excluded_material_2"],
  11. "preferred_variant_name": "beautiful_nozzle",
  12. "preferred_material": "beautiful_material",
  13. "preferred_quality_type": "beautiful_quality_type"
  14. }
  15. @pytest.fixture
  16. def container_registry():
  17. result = MagicMock()
  18. result.findInstanceContainersMetadata = MagicMock(return_value = [{"id": "variant_1", "name": "Variant One", "quality_type": "normal"}, {"id": "variant_2", "name": "Variant Two", "quality_type": "great"}])
  19. result.findContainersMetadata = MagicMock(return_value = [metadata_dict])
  20. return result
  21. def getMetadataEntrySideEffect(*args, **kwargs):
  22. return metadata_dict.get(args[0])
  23. def createMockedInstanceContainer():
  24. result = MagicMock(spec = ContainerInterface)
  25. result.getMetaDataEntry = MagicMock(side_effect = getMetadataEntrySideEffect)
  26. return result
  27. def createMachineNode(container_id, container_registry):
  28. with patch("cura.Machines.MachineNode.VariantNode"): # We're not testing the variant node here, so patch it out.
  29. with patch("cura.Machines.MachineNode.QualityNode"):
  30. with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = container_registry)):
  31. return MachineNode(container_id)
  32. def test_machineNodeInit(container_registry):
  33. machine_node = createMachineNode("machine_1", container_registry)
  34. # As variants get stored by name, we want to check if those get added.
  35. assert "Variant One" in machine_node.variants
  36. assert "Variant Two" in machine_node.variants
  37. assert len(machine_node.variants) == 2 # And ensure that *only* those two got added.
  38. def test_metadataProperties(container_registry):
  39. node = createMachineNode("machine_1", container_registry)
  40. # Check if each of the metadata entries got stored properly.
  41. assert not node.has_materials
  42. assert node.has_variants
  43. assert node.has_machine_quality
  44. assert node.quality_definition == metadata_dict["quality_definition"]
  45. assert node.exclude_materials == metadata_dict["exclude_materials"]
  46. assert node.preferred_variant_name == metadata_dict["preferred_variant_name"]
  47. assert node.preferred_material == metadata_dict["preferred_material"]
  48. assert node.preferred_quality_type == metadata_dict["preferred_quality_type"]
  49. ## Test getting quality groups when there are quality profiles available for
  50. # the requested configurations on two extruders.
  51. def test_getQualityGroupsBothExtrudersAvailable():
  52. # Create a machine node without constructing the tree beneath it. We don't want to depend on that for this test.
  53. empty_container_registry = MagicMock()
  54. empty_container_registry.findContainersMetadata = MagicMock(return_value = [metadata_dict]) # Still contain the MachineNode's own metadata for the constructor.
  55. empty_container_registry.findInstanceContainersMetadata = MagicMock(return_value = [])
  56. with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = empty_container_registry)):
  57. with patch("cura.Machines.MachineNode.MachineNode._loadAll", MagicMock()):
  58. machine_node = MachineNode("machine_1")
  59. # Prepare a tree inside the machine node.
  60. extruder_0_node = MagicMock(quality_type = "quality_type_1")
  61. extruder_1_node = MagicMock(quality_type = "quality_type_1") # Same quality type, so this is the one that can be returned.
  62. machine_node.variants = {
  63. "variant_1": MagicMock(
  64. materials = {
  65. "material_1": MagicMock(
  66. qualities = {
  67. "quality_1": extruder_0_node
  68. }
  69. )
  70. }
  71. ),
  72. "variant_2": MagicMock(
  73. materials = {
  74. "material_2": MagicMock(
  75. qualities = {
  76. "quality_2": extruder_1_node
  77. }
  78. )
  79. }
  80. )
  81. }
  82. global_node = MagicMock(
  83. container = MagicMock(id = "global_quality_container"), # Needs to exist, otherwise it won't add this quality type.
  84. getMetaDataEntry = lambda _, __: "Global Quality Profile Name"
  85. )
  86. machine_node.global_qualities = {
  87. "quality_type_1": global_node
  88. }
  89. # Request the quality groups for the variants in the machine tree.
  90. result = machine_node.getQualityGroups(["variant_1", "variant_2"], ["material_1", "material_2"], [True, True])
  91. assert "quality_type_1" in result, "This quality type was available for both extruders."
  92. assert result["quality_type_1"].node_for_global == global_node
  93. assert result["quality_type_1"].nodes_for_extruders[0] == extruder_0_node
  94. assert result["quality_type_1"].nodes_for_extruders[1] == extruder_1_node
  95. assert result["quality_type_1"].name == global_node.getMetaDataEntry("name", "Unnamed Profile")
  96. assert result["quality_type_1"].quality_type == "quality_type_1"