mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-07 06:57:28 -06:00

When the machine manager calls the _onGlobalContainerChanged(), it calls updateNumberExtruders Enabled, which triggers the signal numberExtrudersEnabledChanged. This, in turn, triggers the need to check the MachineManager's pyqtProperty numberExtrudersEnabled. Now, since this property has no setter, it cannot be patched. Instead, to work properly, patch the updateNumberExtrudersEnabled. CURA-7827
257 lines
12 KiB
Python
257 lines
12 KiB
Python
from unittest.mock import MagicMock, patch, PropertyMock
|
|
import pytest
|
|
|
|
from cura.Settings.MachineManager import MachineManager
|
|
|
|
|
|
def createMockedStack(stack_id: str, name: str):
|
|
stack = MagicMock(name=name)
|
|
stack.getId = MagicMock(return_value=stack_id)
|
|
return stack
|
|
|
|
|
|
@pytest.fixture()
|
|
def global_stack():
|
|
return createMockedStack("GlobalStack", "Global Stack")
|
|
|
|
|
|
@pytest.fixture()
|
|
def machine_manager(application, extruder_manager, container_registry, global_stack) -> MachineManager:
|
|
application.getExtruderManager = MagicMock(return_value = extruder_manager)
|
|
application.getGlobalContainerStack = MagicMock(return_value = global_stack)
|
|
with patch("cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance", MagicMock(return_value=container_registry)):
|
|
manager = MachineManager(application)
|
|
manager.updateNumberExtrudersEnabled = MagicMock()
|
|
manager._onGlobalContainerChanged()
|
|
|
|
return manager
|
|
|
|
|
|
def test_getMachine():
|
|
registry = MagicMock()
|
|
mocked_global_stack = MagicMock()
|
|
mocked_global_stack.getId = MagicMock(return_value="test_machine")
|
|
mocked_global_stack.definition.getId = MagicMock(return_value = "test")
|
|
registry.findContainerStacks = MagicMock(return_value=[mocked_global_stack])
|
|
with patch("cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance", MagicMock(return_value=registry)):
|
|
assert MachineManager.getMachine("test") == mocked_global_stack
|
|
# Since only test is in the registry, this should be None
|
|
assert MachineManager.getMachine("UnknownMachine") is None
|
|
|
|
|
|
def test_addMachine(machine_manager):
|
|
registry = MagicMock()
|
|
|
|
mocked_stack = MagicMock()
|
|
mocked_stack.getId = MagicMock(return_value="newlyCreatedStack")
|
|
mocked_create_machine = MagicMock(name="createMachine", return_value = mocked_stack)
|
|
machine_manager.setActiveMachine = MagicMock()
|
|
with patch("cura.Settings.CuraStackBuilder.CuraStackBuilder.createMachine", mocked_create_machine):
|
|
with patch("cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance", MagicMock(return_value=registry)):
|
|
machine_manager.addMachine("derp")
|
|
machine_manager.setActiveMachine.assert_called_with("newlyCreatedStack")
|
|
|
|
|
|
def test_hasUserSettings(machine_manager, application):
|
|
mocked_stack = application.getGlobalContainerStack()
|
|
|
|
mocked_instance_container = MagicMock(name="UserSettingContainer")
|
|
mocked_instance_container.getNumInstances = MagicMock(return_value = 12)
|
|
mocked_stack.getTop = MagicMock(return_value = mocked_instance_container)
|
|
machine_manager._reCalculateNumUserSettings()
|
|
assert machine_manager.numUserSettings == 12
|
|
assert machine_manager.hasUserSettings
|
|
|
|
|
|
def test_hasUserSettingsExtruder(machine_manager, application):
|
|
mocked_stack = application.getGlobalContainerStack()
|
|
extruder = createMockedExtruder("extruder")
|
|
|
|
mocked_instance_container_global = MagicMock(name="UserSettingContainerGlobal")
|
|
mocked_instance_container_global.getNumInstances = MagicMock(return_value=0)
|
|
mocked_stack.getTop = MagicMock(return_value=mocked_instance_container_global)
|
|
mocked_stack.extruderList = [extruder]
|
|
|
|
mocked_instance_container = MagicMock(name="UserSettingContainer")
|
|
mocked_instance_container.getNumInstances = MagicMock(return_value=200)
|
|
extruder.getTop = MagicMock(return_value = mocked_instance_container)
|
|
machine_manager._reCalculateNumUserSettings()
|
|
assert machine_manager.hasUserSettings
|
|
assert machine_manager.numUserSettings == 200
|
|
|
|
|
|
def test_hasUserSettingsEmptyUserChanges(machine_manager, application):
|
|
mocked_stack = application.getGlobalContainerStack()
|
|
extruder = createMockedExtruder("extruder")
|
|
|
|
mocked_instance_container_global = MagicMock(name="UserSettingContainerGlobal")
|
|
mocked_instance_container_global.getNumInstances = MagicMock(return_value=0)
|
|
mocked_stack.getTop = MagicMock(return_value=mocked_instance_container_global)
|
|
mocked_stack.extruderList = [extruder]
|
|
|
|
mocked_instance_container = MagicMock(name="UserSettingContainer")
|
|
mocked_instance_container.getNumInstances = MagicMock(return_value=0)
|
|
extruder.getTop = MagicMock(return_value = mocked_instance_container)
|
|
machine_manager._reCalculateNumUserSettings()
|
|
assert not machine_manager.hasUserSettings
|
|
|
|
|
|
def test_totalNumberOfSettings(machine_manager):
|
|
registry = MagicMock()
|
|
mocked_definition = MagicMock()
|
|
mocked_definition.getAllKeys = MagicMock(return_value = ["omg", "zomg", "foo"])
|
|
registry.findDefinitionContainers = MagicMock(return_value = [mocked_definition])
|
|
with patch("cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance", MagicMock(return_value=registry)):
|
|
assert machine_manager.totalNumberOfSettings == 3
|
|
|
|
|
|
def createMockedExtruder(extruder_id):
|
|
extruder = MagicMock()
|
|
extruder.getId = MagicMock(return_value = extruder_id)
|
|
return extruder
|
|
|
|
|
|
def createMockedInstanceContainer(instance_id, name = ""):
|
|
instance = MagicMock()
|
|
instance.getName = MagicMock(return_value = name)
|
|
instance.getId = MagicMock(return_value=instance_id)
|
|
return instance
|
|
|
|
|
|
def test_globalVariantName(machine_manager, application):
|
|
global_stack = application.getGlobalContainerStack()
|
|
global_stack.variant = createMockedInstanceContainer("beep", "zomg")
|
|
assert machine_manager.globalVariantName == "zomg"
|
|
|
|
|
|
def test_resetSettingForAllExtruders(machine_manager):
|
|
global_stack = machine_manager.activeMachine
|
|
extruder_1 = createMockedExtruder("extruder_1")
|
|
extruder_2 = createMockedExtruder("extruder_2")
|
|
extruder_1.userChanges = createMockedInstanceContainer("settings_1")
|
|
extruder_2.userChanges = createMockedInstanceContainer("settings_2")
|
|
global_stack.extruderList = [extruder_1, extruder_2]
|
|
|
|
machine_manager.resetSettingForAllExtruders("whatever")
|
|
|
|
extruder_1.userChanges.removeInstance.assert_called_once_with("whatever")
|
|
extruder_2.userChanges.removeInstance.assert_called_once_with("whatever")
|
|
|
|
|
|
def test_setUnknownActiveMachine(machine_manager):
|
|
machine_action_manager = MagicMock()
|
|
machine_manager.getMachineActionManager = MagicMock(return_value = machine_action_manager)
|
|
|
|
machine_manager.setActiveMachine("UnknownMachine")
|
|
# The machine isn't known to us, so this should not happen!
|
|
machine_action_manager.addDefaultMachineActions.assert_not_called()
|
|
|
|
|
|
def test_clearActiveMachine(machine_manager):
|
|
machine_manager.setActiveMachine(None)
|
|
|
|
machine_manager._application.setGlobalContainerStack.assert_called_once_with(None)
|
|
|
|
|
|
def test_setActiveMachine(machine_manager):
|
|
registry = MagicMock()
|
|
machine_action_manager = MagicMock()
|
|
machine_manager._validateVariantsAndMaterials = MagicMock() # Not testing that function, so whatever.
|
|
machine_manager._application.getMachineActionManager = MagicMock(return_value=machine_action_manager)
|
|
global_stack = createMockedStack("NewMachine", "Newly created Machine")
|
|
|
|
# Ensure that the container stack will be found
|
|
registry.findContainerStacks = MagicMock(return_value = [global_stack])
|
|
with patch("cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance", MagicMock(return_value=registry)):
|
|
with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=registry)):
|
|
with patch("cura.Settings.ExtruderManager.ExtruderManager.getInstance"): # Prevent the FixSingleExtruder from being called
|
|
machine_manager.setActiveMachine("NewMachine")
|
|
|
|
machine_action_manager.addDefaultMachineActions.assert_called_once_with(global_stack)
|
|
# Yeah sure. It's technically an implementation detail. But if this function wasn't called, it exited early somehow
|
|
machine_manager._validateVariantsAndMaterials.assert_called_once_with(global_stack)
|
|
|
|
|
|
def test_setInvalidActiveMachine(machine_manager):
|
|
registry = MagicMock()
|
|
global_stack = createMockedStack("InvalidMachine", "Newly created Machine")
|
|
|
|
# This machine is just plain wrong!
|
|
global_stack.isValid = MagicMock(return_value = False)
|
|
|
|
# Ensure that the container stack will be found
|
|
registry.findContainerStacks = MagicMock(return_value=[global_stack])
|
|
|
|
configuration_error_message = MagicMock()
|
|
|
|
with patch("cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance", MagicMock(return_value=registry)):
|
|
with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=registry)):
|
|
with patch("cura.Settings.ExtruderManager.ExtruderManager.getInstance"): # Prevent the FixSingleExtruder from being called
|
|
with patch("UM.ConfigurationErrorMessage.ConfigurationErrorMessage.getInstance", MagicMock(return_value = configuration_error_message)):
|
|
machine_manager.setActiveMachine("InvalidMachine")
|
|
|
|
# Notification stuff should happen now!
|
|
configuration_error_message.addFaultyContainers.assert_called_once_with("InvalidMachine")
|
|
|
|
|
|
def test_clearUserSettingsAllCurrentStacks(machine_manager, application):
|
|
global_stack = application.getGlobalContainerStack()
|
|
extruder_1 = createMockedExtruder("extruder_1")
|
|
instance_container = createMockedInstanceContainer("user", "UserContainer")
|
|
extruder_1.getTop = MagicMock(return_value = instance_container)
|
|
global_stack.extruderList = [extruder_1]
|
|
|
|
machine_manager.clearUserSettingAllCurrentStacks("some_setting")
|
|
|
|
instance_container.removeInstance.assert_called_once_with("some_setting", postpone_emit=True)
|
|
|
|
|
|
def test_clearUserSettingsAllCurrentStacksLinkedSetting(machine_manager, application):
|
|
global_stack = application.getGlobalContainerStack()
|
|
extruder_1 = createMockedExtruder("extruder_1")
|
|
instance_container = createMockedInstanceContainer("user", "UserContainer")
|
|
instance_container_global = createMockedInstanceContainer("global_user", "GlobalUserContainer")
|
|
global_stack.getTop = MagicMock(return_value = instance_container_global)
|
|
extruder_1.getTop = MagicMock(return_value=instance_container)
|
|
global_stack.extruderList = [extruder_1]
|
|
|
|
global_stack.getProperty = MagicMock(side_effect = lambda key, prop: True if prop == "settable_per_extruder" else "-1" )
|
|
|
|
machine_manager.clearUserSettingAllCurrentStacks("some_setting")
|
|
|
|
instance_container.removeInstance.assert_not_called()
|
|
instance_container_global.removeInstance.assert_called_once_with("some_setting", postpone_emit = True)
|
|
|
|
|
|
def test_isActiveQualityExperimental(machine_manager):
|
|
quality_group = MagicMock(is_experimental = True)
|
|
machine_manager.activeQualityGroup = MagicMock(return_value = quality_group)
|
|
assert machine_manager.isActiveQualityExperimental
|
|
|
|
|
|
def test_isActiveQualityNotExperimental(machine_manager):
|
|
quality_group = MagicMock(is_experimental = False)
|
|
machine_manager.activeQualityGroup = MagicMock(return_value = quality_group)
|
|
assert not machine_manager.isActiveQualityExperimental
|
|
|
|
|
|
def test_isActiveQualityNotExperimental_noQualityGroup(machine_manager):
|
|
machine_manager.activeQualityGroup = MagicMock(return_value=None)
|
|
assert not machine_manager.isActiveQualityExperimental
|
|
|
|
|
|
def test_isActiveQualitySupported(machine_manager):
|
|
quality_group = MagicMock(is_available=True)
|
|
machine_manager.activeQualityGroup = MagicMock(return_value=quality_group)
|
|
assert machine_manager.isActiveQualitySupported
|
|
|
|
|
|
def test_isActiveQualityNotSupported(machine_manager):
|
|
quality_group = MagicMock(is_available=False)
|
|
machine_manager.activeQualityGroup = MagicMock(return_value=quality_group)
|
|
assert not machine_manager.isActiveQualitySupported
|
|
|
|
|
|
def test_isActiveQualityNotSupported_noQualityGroup(machine_manager):
|
|
machine_manager.activeQualityGroup = MagicMock(return_value=None)
|
|
assert not machine_manager.isActiveQualitySupported
|