TestMachineManager.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. from unittest.mock import MagicMock, patch, PropertyMock
  2. import pytest
  3. from cura.Settings.MachineManager import MachineManager
  4. def createMockedStack(stack_id: str, name: str):
  5. stack = MagicMock(name=name)
  6. stack.getId = MagicMock(return_value=stack_id)
  7. return stack
  8. @pytest.fixture()
  9. def global_stack():
  10. return createMockedStack("GlobalStack", "Global Stack")
  11. @pytest.fixture()
  12. def machine_manager(application, extruder_manager, container_registry, global_stack) -> MachineManager:
  13. application.getExtruderManager = MagicMock(return_value = extruder_manager)
  14. application.getGlobalContainerStack = MagicMock(return_value = global_stack)
  15. with patch("cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance", MagicMock(return_value=container_registry)):
  16. manager = MachineManager(application)
  17. with patch.object(MachineManager, "updateNumberExtrudersEnabled", return_value = None):
  18. manager._onGlobalContainerChanged()
  19. return manager
  20. def test_getMachine():
  21. registry = MagicMock()
  22. mocked_global_stack = MagicMock()
  23. mocked_global_stack.getId = MagicMock(return_value="test_machine")
  24. mocked_global_stack.definition.getId = MagicMock(return_value = "test")
  25. registry.findContainerStacks = MagicMock(return_value=[mocked_global_stack])
  26. with patch("cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance", MagicMock(return_value=registry)):
  27. assert MachineManager.getMachine("test") == mocked_global_stack
  28. # Since only test is in the registry, this should be None
  29. assert MachineManager.getMachine("UnknownMachine") is None
  30. def test_addMachine(machine_manager):
  31. registry = MagicMock()
  32. mocked_stack = MagicMock()
  33. mocked_stack.getId = MagicMock(return_value="newlyCreatedStack")
  34. mocked_create_machine = MagicMock(name="createMachine", return_value = mocked_stack)
  35. machine_manager.setActiveMachine = MagicMock()
  36. with patch("cura.Settings.CuraStackBuilder.CuraStackBuilder.createMachine", mocked_create_machine):
  37. with patch("cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance", MagicMock(return_value=registry)):
  38. machine_manager.addMachine("derp")
  39. machine_manager.setActiveMachine.assert_called_with("newlyCreatedStack")
  40. def test_hasUserSettings(machine_manager, application):
  41. mocked_stack = application.getGlobalContainerStack()
  42. mocked_instance_container = MagicMock(name="UserSettingContainer")
  43. mocked_instance_container.getNumInstances = MagicMock(return_value = 12)
  44. mocked_stack.getTop = MagicMock(return_value = mocked_instance_container)
  45. machine_manager._reCalculateNumUserSettings()
  46. assert machine_manager.numUserSettings == 12
  47. assert machine_manager.hasUserSettings
  48. def test_hasUserSettingsExtruder(machine_manager, application):
  49. mocked_stack = application.getGlobalContainerStack()
  50. extruder = createMockedExtruder("extruder")
  51. mocked_instance_container_global = MagicMock(name="UserSettingContainerGlobal")
  52. mocked_instance_container_global.getNumInstances = MagicMock(return_value=0)
  53. mocked_stack.getTop = MagicMock(return_value=mocked_instance_container_global)
  54. mocked_stack.extruderList = [extruder]
  55. mocked_instance_container = MagicMock(name="UserSettingContainer")
  56. mocked_instance_container.getNumInstances = MagicMock(return_value=200)
  57. extruder.getTop = MagicMock(return_value = mocked_instance_container)
  58. machine_manager._reCalculateNumUserSettings()
  59. assert machine_manager.hasUserSettings
  60. assert machine_manager.numUserSettings == 200
  61. def test_hasUserSettingsEmptyUserChanges(machine_manager, application):
  62. mocked_stack = application.getGlobalContainerStack()
  63. extruder = createMockedExtruder("extruder")
  64. mocked_instance_container_global = MagicMock(name="UserSettingContainerGlobal")
  65. mocked_instance_container_global.getNumInstances = MagicMock(return_value=0)
  66. mocked_stack.getTop = MagicMock(return_value=mocked_instance_container_global)
  67. mocked_stack.extruderList = [extruder]
  68. mocked_instance_container = MagicMock(name="UserSettingContainer")
  69. mocked_instance_container.getNumInstances = MagicMock(return_value=0)
  70. extruder.getTop = MagicMock(return_value = mocked_instance_container)
  71. machine_manager._reCalculateNumUserSettings()
  72. assert not machine_manager.hasUserSettings
  73. def test_totalNumberOfSettings(machine_manager):
  74. registry = MagicMock()
  75. mocked_definition = MagicMock()
  76. mocked_definition.getAllKeys = MagicMock(return_value = ["omg", "zomg", "foo"])
  77. registry.findDefinitionContainers = MagicMock(return_value = [mocked_definition])
  78. with patch("cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance", MagicMock(return_value=registry)):
  79. assert machine_manager.totalNumberOfSettings == 3
  80. def createMockedExtruder(extruder_id):
  81. extruder = MagicMock()
  82. extruder.getId = MagicMock(return_value = extruder_id)
  83. return extruder
  84. def createMockedInstanceContainer(instance_id, name = ""):
  85. instance = MagicMock()
  86. instance.getName = MagicMock(return_value = name)
  87. instance.getId = MagicMock(return_value=instance_id)
  88. return instance
  89. def test_globalVariantName(machine_manager, application):
  90. global_stack = application.getGlobalContainerStack()
  91. global_stack.variant = createMockedInstanceContainer("beep", "zomg")
  92. assert machine_manager.globalVariantName == "zomg"
  93. def test_resetSettingForAllExtruders(machine_manager):
  94. global_stack = machine_manager.activeMachine
  95. extruder_1 = createMockedExtruder("extruder_1")
  96. extruder_2 = createMockedExtruder("extruder_2")
  97. extruder_1.userChanges = createMockedInstanceContainer("settings_1")
  98. extruder_2.userChanges = createMockedInstanceContainer("settings_2")
  99. global_stack.extruderList = [extruder_1, extruder_2]
  100. machine_manager.resetSettingForAllExtruders("whatever")
  101. extruder_1.userChanges.removeInstance.assert_called_once_with("whatever")
  102. extruder_2.userChanges.removeInstance.assert_called_once_with("whatever")
  103. def test_setUnknownActiveMachine(machine_manager):
  104. machine_action_manager = MagicMock()
  105. machine_manager.getMachineActionManager = MagicMock(return_value = machine_action_manager)
  106. machine_manager.setActiveMachine("UnknownMachine")
  107. # The machine isn't known to us, so this should not happen!
  108. machine_action_manager.addDefaultMachineActions.assert_not_called()
  109. def test_clearActiveMachine(machine_manager):
  110. machine_manager.setActiveMachine(None)
  111. machine_manager._application.setGlobalContainerStack.assert_called_once_with(None)
  112. def test_setActiveMachine(machine_manager):
  113. registry = MagicMock()
  114. machine_action_manager = MagicMock()
  115. machine_manager._validateVariantsAndMaterials = MagicMock() # Not testing that function, so whatever.
  116. machine_manager._application.getMachineActionManager = MagicMock(return_value=machine_action_manager)
  117. global_stack = createMockedStack("NewMachine", "Newly created Machine")
  118. # Ensure that the container stack will be found
  119. registry.findContainerStacks = MagicMock(return_value = [global_stack])
  120. with patch("cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance", MagicMock(return_value=registry)):
  121. with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=registry)):
  122. with patch("cura.Settings.ExtruderManager.ExtruderManager.getInstance"): # Prevent the FixSingleExtruder from being called
  123. machine_manager.setActiveMachine("NewMachine")
  124. machine_action_manager.addDefaultMachineActions.assert_called_once_with(global_stack)
  125. # Yeah sure. It's technically an implementation detail. But if this function wasn't called, it exited early somehow
  126. machine_manager._validateVariantsAndMaterials.assert_called_once_with(global_stack)
  127. def test_setInvalidActiveMachine(machine_manager):
  128. registry = MagicMock()
  129. global_stack = createMockedStack("InvalidMachine", "Newly created Machine")
  130. # This machine is just plain wrong!
  131. global_stack.isValid = MagicMock(return_value = False)
  132. # Ensure that the container stack will be found
  133. registry.findContainerStacks = MagicMock(return_value=[global_stack])
  134. configuration_error_message = MagicMock()
  135. with patch("cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance", MagicMock(return_value=registry)):
  136. with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=registry)):
  137. with patch("cura.Settings.ExtruderManager.ExtruderManager.getInstance"): # Prevent the FixSingleExtruder from being called
  138. with patch("UM.ConfigurationErrorMessage.ConfigurationErrorMessage.getInstance", MagicMock(return_value = configuration_error_message)):
  139. machine_manager.setActiveMachine("InvalidMachine")
  140. # Notification stuff should happen now!
  141. configuration_error_message.addFaultyContainers.assert_called_once_with("InvalidMachine")
  142. def test_clearUserSettingsAllCurrentStacks(machine_manager, application):
  143. global_stack = application.getGlobalContainerStack()
  144. extruder_1 = createMockedExtruder("extruder_1")
  145. instance_container = createMockedInstanceContainer("user", "UserContainer")
  146. extruder_1.getTop = MagicMock(return_value = instance_container)
  147. global_stack.extruderList = [extruder_1]
  148. machine_manager.clearUserSettingAllCurrentStacks("some_setting")
  149. instance_container.removeInstance.assert_called_once_with("some_setting", postpone_emit=True)
  150. def test_clearUserSettingsAllCurrentStacksLinkedSetting(machine_manager, application):
  151. global_stack = application.getGlobalContainerStack()
  152. extruder_1 = createMockedExtruder("extruder_1")
  153. instance_container = createMockedInstanceContainer("user", "UserContainer")
  154. instance_container_global = createMockedInstanceContainer("global_user", "GlobalUserContainer")
  155. global_stack.getTop = MagicMock(return_value = instance_container_global)
  156. extruder_1.getTop = MagicMock(return_value=instance_container)
  157. global_stack.extruderList = [extruder_1]
  158. global_stack.getProperty = MagicMock(side_effect = lambda key, prop: True if prop == "settable_per_extruder" else "-1" )
  159. machine_manager.clearUserSettingAllCurrentStacks("some_setting")
  160. instance_container.removeInstance.assert_not_called()
  161. instance_container_global.removeInstance.assert_called_once_with("some_setting", postpone_emit = True)
  162. def test_isActiveQualityExperimental(machine_manager):
  163. quality_group = MagicMock(is_experimental = True)
  164. machine_manager.activeQualityGroup = MagicMock(return_value = quality_group)
  165. assert machine_manager.isActiveQualityExperimental
  166. def test_isActiveQualityNotExperimental(machine_manager):
  167. quality_group = MagicMock(is_experimental = False)
  168. machine_manager.activeQualityGroup = MagicMock(return_value = quality_group)
  169. assert not machine_manager.isActiveQualityExperimental
  170. def test_isActiveQualityNotExperimental_noQualityGroup(machine_manager):
  171. machine_manager.activeQualityGroup = MagicMock(return_value=None)
  172. assert not machine_manager.isActiveQualityExperimental
  173. def test_isActiveQualitySupported(machine_manager):
  174. quality_group = MagicMock(is_available=True)
  175. machine_manager.activeQualityGroup = MagicMock(return_value=quality_group)
  176. assert machine_manager.isActiveQualitySupported
  177. def test_isActiveQualityNotSupported(machine_manager):
  178. quality_group = MagicMock(is_available=False)
  179. machine_manager.activeQualityGroup = MagicMock(return_value=quality_group)
  180. assert not machine_manager.isActiveQualitySupported
  181. def test_isActiveQualityNotSupported_noQualityGroup(machine_manager):
  182. machine_manager.activeQualityGroup = MagicMock(return_value=None)
  183. assert not machine_manager.isActiveQualitySupported