test_scheduler_clear_plate.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. """Tests for the clear plate queue flow in the print scheduler."""
  2. from unittest.mock import MagicMock, patch
  3. import pytest
  4. from backend.app.services.print_scheduler import PrintScheduler
  5. from backend.app.services.printer_manager import PrinterManager
  6. class TestPrinterManagerPlateCleared:
  7. """Test the plate-cleared flag management in PrinterManager."""
  8. @pytest.fixture
  9. def manager(self):
  10. return PrinterManager()
  11. def test_plate_cleared_initially_false(self, manager):
  12. """No printers should have plate cleared by default."""
  13. assert not manager.is_plate_cleared(1)
  14. assert not manager.is_plate_cleared(999)
  15. def test_set_plate_cleared(self, manager):
  16. """Setting plate cleared should make is_plate_cleared return True."""
  17. manager.set_plate_cleared(1)
  18. assert manager.is_plate_cleared(1)
  19. assert not manager.is_plate_cleared(2)
  20. def test_consume_plate_cleared(self, manager):
  21. """Consuming plate cleared should reset the flag."""
  22. manager.set_plate_cleared(1)
  23. assert manager.is_plate_cleared(1)
  24. manager.consume_plate_cleared(1)
  25. assert not manager.is_plate_cleared(1)
  26. def test_consume_plate_cleared_idempotent(self, manager):
  27. """Consuming when not set should not raise."""
  28. manager.consume_plate_cleared(1) # Should not raise
  29. assert not manager.is_plate_cleared(1)
  30. def test_set_plate_cleared_multiple_printers(self, manager):
  31. """Plate cleared should be tracked per printer."""
  32. manager.set_plate_cleared(1)
  33. manager.set_plate_cleared(3)
  34. assert manager.is_plate_cleared(1)
  35. assert not manager.is_plate_cleared(2)
  36. assert manager.is_plate_cleared(3)
  37. def test_consume_only_affects_target_printer(self, manager):
  38. """Consuming plate cleared for one printer should not affect others."""
  39. manager.set_plate_cleared(1)
  40. manager.set_plate_cleared(2)
  41. manager.consume_plate_cleared(1)
  42. assert not manager.is_plate_cleared(1)
  43. assert manager.is_plate_cleared(2)
  44. class TestSchedulerIdleCheckWithPlateCleared:
  45. """Test _is_printer_idle with plate-cleared flag interactions."""
  46. @pytest.fixture
  47. def scheduler(self):
  48. return PrintScheduler()
  49. @patch("backend.app.services.print_scheduler.printer_manager")
  50. def test_idle_state_is_idle(self, mock_pm, scheduler):
  51. """Printer in IDLE state should be considered idle."""
  52. mock_pm.is_connected.return_value = True
  53. mock_pm.get_status.return_value = MagicMock(state="IDLE")
  54. assert scheduler._is_printer_idle(1) is True
  55. @patch("backend.app.services.print_scheduler.printer_manager")
  56. def test_running_state_not_idle(self, mock_pm, scheduler):
  57. """Printer in RUNNING state should not be idle."""
  58. mock_pm.is_connected.return_value = True
  59. mock_pm.get_status.return_value = MagicMock(state="RUNNING")
  60. assert scheduler._is_printer_idle(1) is False
  61. @patch("backend.app.services.print_scheduler.printer_manager")
  62. def test_finish_state_not_idle_without_plate_cleared(self, mock_pm, scheduler):
  63. """Printer in FINISH state should NOT be idle without plate cleared."""
  64. mock_pm.is_connected.return_value = True
  65. mock_pm.get_status.return_value = MagicMock(state="FINISH")
  66. mock_pm.is_plate_cleared.return_value = False
  67. assert scheduler._is_printer_idle(1) is False
  68. @patch("backend.app.services.print_scheduler.printer_manager")
  69. def test_finish_state_idle_with_plate_cleared(self, mock_pm, scheduler):
  70. """Printer in FINISH state should be idle when plate is cleared."""
  71. mock_pm.is_connected.return_value = True
  72. mock_pm.get_status.return_value = MagicMock(state="FINISH")
  73. mock_pm.is_plate_cleared.return_value = True
  74. assert scheduler._is_printer_idle(1) is True
  75. @patch("backend.app.services.print_scheduler.printer_manager")
  76. def test_failed_state_not_idle_without_plate_cleared(self, mock_pm, scheduler):
  77. """Printer in FAILED state should NOT be idle without plate cleared."""
  78. mock_pm.is_connected.return_value = True
  79. mock_pm.get_status.return_value = MagicMock(state="FAILED")
  80. mock_pm.is_plate_cleared.return_value = False
  81. assert scheduler._is_printer_idle(1) is False
  82. @patch("backend.app.services.print_scheduler.printer_manager")
  83. def test_failed_state_idle_with_plate_cleared(self, mock_pm, scheduler):
  84. """Printer in FAILED state should be idle when plate is cleared."""
  85. mock_pm.is_connected.return_value = True
  86. mock_pm.get_status.return_value = MagicMock(state="FAILED")
  87. mock_pm.is_plate_cleared.return_value = True
  88. assert scheduler._is_printer_idle(1) is True
  89. @patch("backend.app.services.print_scheduler.printer_manager")
  90. def test_disconnected_printer_not_idle(self, mock_pm, scheduler):
  91. """Disconnected printer should never be idle."""
  92. mock_pm.is_connected.return_value = False
  93. assert scheduler._is_printer_idle(1) is False
  94. @patch("backend.app.services.print_scheduler.printer_manager")
  95. def test_no_status_not_idle(self, mock_pm, scheduler):
  96. """Printer with no status should not be idle."""
  97. mock_pm.is_connected.return_value = True
  98. mock_pm.get_status.return_value = None
  99. assert scheduler._is_printer_idle(1) is False