| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- """Spoolman tracking for an archive printing on several printers at once.
- A batch dispatches one archive as several queue items. The print-start
- capture looked the queue item up by archive alone and insisted on one row, so
- with two copies printing it raised and the print was never charged.
- """
- from types import SimpleNamespace
- from unittest.mock import AsyncMock, MagicMock, patch
- import pytest
- from backend.app.models.active_print_spoolman import ActivePrintSpoolman # registers its table
- from backend.app.models.print_queue import PrintQueueItem
- from backend.app.services.spoolman_tracking import store_print_data
- @pytest.mark.asyncio
- @pytest.mark.integration
- async def test_each_printer_reads_its_own_queue_item(db_session, printer_factory, archive_factory):
- from sqlalchemy import select
- printer_a = await printer_factory()
- printer_b = await printer_factory()
- archive = await archive_factory(printer_a.id, status="printing", with_run=False)
- db_session.add(PrintQueueItem(printer_id=printer_a.id, archive_id=archive.id, plate_id=2, status="printing"))
- db_session.add(PrintQueueItem(printer_id=printer_b.id, archive_id=archive.id, plate_id=3, status="printing"))
- await db_session.commit()
- plates: list = []
- printer_manager = MagicMock()
- printer_manager.get_status.return_value = SimpleNamespace(
- raw_data={"ams": [{"id": 0, "tray": [{"id": 0, "tray_type": "PLA"}]}]}
- )
- mock_settings = MagicMock()
- mock_path = MagicMock()
- mock_path.exists.return_value = True
- mock_settings.base_dir.__truediv__.return_value = mock_path
- def _usage(path, plate_id=None):
- plates.append(plate_id)
- return [{"slot_id": 1, "used_g": 5.0, "type": "PLA", "color": "#FF0000"}]
- with (
- patch("backend.app.services.spoolman_tracking.app_settings", mock_settings),
- patch("backend.app.api.routes.settings.get_setting", AsyncMock(return_value="true")),
- patch("backend.app.utils.threemf_tools.extract_filament_usage_from_3mf", side_effect=_usage),
- patch("backend.app.utils.threemf_tools.extract_layer_filament_usage_from_3mf", return_value=None),
- patch("backend.app.utils.threemf_tools.extract_filament_properties_from_3mf", return_value={}),
- ):
- await store_print_data(
- printer_id=printer_a.id,
- archive_id=archive.id,
- file_path="archives/test.3mf",
- db=db_session,
- printer_manager=printer_manager,
- ams_mapping=[0],
- )
- assert plates == [2]
- rows = (await db_session.execute(select(ActivePrintSpoolman))).scalars().all()
- assert [r.printer_id for r in rows] == [printer_a.id]
|