test_spoolman_partial_usage_layer_reset.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. """Spoolman partial usage of an aborted print whose printer reset its layer to 0.
  2. The firmware zeroes ``layer_num`` on cancel. The layer captured during the
  3. print then decides how far the print got; without it the abort reports no
  4. usage at all (the progress estimate needs a total layer count, which an
  5. aborted print may not have either).
  6. """
  7. from types import SimpleNamespace
  8. from unittest.mock import AsyncMock, MagicMock, patch
  9. import pytest
  10. from backend.app.services import spoolman_tracking
  11. @pytest.mark.asyncio
  12. @pytest.mark.parametrize(("last_layer_num", "charged_at"), [(12, 12), (None, None)])
  13. async def test_the_captured_layer_stands_in_for_the_reset_one(last_layer_num, charged_at):
  14. session = MagicMock()
  15. session.return_value.__aenter__ = AsyncMock(return_value=MagicMock())
  16. session.return_value.__aexit__ = AsyncMock(return_value=False)
  17. tracking = SimpleNamespace(
  18. layer_usage={"12": {"0": 500.0}},
  19. filament_properties={},
  20. filament_usage=[{"slot_id": 1, "used_g": 10.0}],
  21. ams_trays={},
  22. slot_to_tray=[0],
  23. tray_remain_start={},
  24. archive_id=1,
  25. tray_now_at_start=0,
  26. )
  27. cumulative = MagicMock(return_value={})
  28. status = SimpleNamespace(layer_num=0, total_layers=None, raw_data={}, tray_change_log=[])
  29. with (
  30. patch.object(spoolman_tracking, "async_session", session),
  31. patch("backend.app.api.routes.settings.get_setting", AsyncMock(return_value="true")),
  32. patch("backend.app.services.printer_manager.printer_manager.get_status", MagicMock(return_value=status)),
  33. patch.object(spoolman_tracking, "_get_printer_serial", AsyncMock(return_value="SERIAL")),
  34. patch.object(spoolman_tracking, "_get_spoolman_client_with_fallback", AsyncMock(return_value=MagicMock())),
  35. patch("backend.app.utils.threemf_tools.get_cumulative_usage_at_layer", cumulative),
  36. ):
  37. await spoolman_tracking._report_partial_usage(1, tracking, last_layer_num=last_layer_num)
  38. if charged_at is None:
  39. cumulative.assert_not_called()
  40. else:
  41. assert cumulative.call_args.args[1] == charged_at