test_ams_label_position_key_3348.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. """An AMS label saved before its unit reported a serial (#3348).
  2. A label is kept under the unit's serial, or under the position key
  3. ``p<printer>a<unit>`` while the unit reports none. The AMS Lite reported none
  4. until #3348, so its labels sit under the position key, and now the unit comes
  5. with a serial. The label must still show everywhere, be cleared by Clear, and
  6. move to the serial when it is saved again.
  7. """
  8. from unittest.mock import MagicMock, patch
  9. import pytest
  10. from httpx import AsyncClient
  11. from sqlalchemy import select
  12. from backend.app.models.ams_label import AmsLabel
  13. SERIAL = "AMSLITE0001"
  14. def _state():
  15. return MagicMock(connected=True, raw_data={"ams": [{"id": 0, "sn": SERIAL}]})
  16. async def _labels(db_session):
  17. rows = (await db_session.execute(select(AmsLabel))).scalars().all()
  18. return {r.ams_serial_number: r.label for r in rows}
  19. @pytest.fixture
  20. async def printer(printer_factory, db_session):
  21. printer = await printer_factory(model="A1")
  22. db_session.add(AmsLabel(ams_serial_number=f"p{printer.id}a0", ams_id=0, label="Desk Lite"))
  23. await db_session.commit()
  24. return printer
  25. @pytest.mark.asyncio
  26. @pytest.mark.integration
  27. class TestPrinterCard:
  28. async def test_still_shown(self, async_client: AsyncClient, printer):
  29. with patch("backend.app.api.routes.printers.printer_manager") as pm:
  30. pm.get_status.return_value = _state()
  31. resp = await async_client.get(f"/api/v1/printers/{printer.id}/ams-labels")
  32. assert resp.json() == {"0": "Desk Lite"}
  33. async def test_clear_removes_it(self, async_client: AsyncClient, printer, db_session):
  34. resp = await async_client.delete(f"/api/v1/printers/{printer.id}/ams-labels/0?ams_serial={SERIAL}")
  35. assert resp.json() == {"success": True}
  36. assert await _labels(db_session) == {}
  37. async def test_saving_moves_it_to_the_serial(self, async_client: AsyncClient, printer, db_session):
  38. await async_client.put(
  39. f"/api/v1/printers/{printer.id}/ams-labels/0", json={"label": "Lite", "ams_serial": SERIAL}
  40. )
  41. assert await _labels(db_session) == {SERIAL: "Lite"}
  42. async def test_saving_without_a_serial_keeps_the_position_key(self, async_client: AsyncClient, printer, db_session):
  43. await async_client.put(f"/api/v1/printers/{printer.id}/ams-labels/0", json={"label": "Lite"})
  44. assert await _labels(db_session) == {f"p{printer.id}a0": "Lite"}
  45. @pytest.mark.asyncio
  46. @pytest.mark.integration
  47. async def test_inventory_location_shows_it(async_client: AsyncClient, printer, db_session):
  48. from backend.app.models.spool import Spool
  49. from backend.app.models.spool_assignment import SpoolAssignment
  50. spool = Spool(material="PLA", brand="eSUN", rgba="E1E9E9FF", label_weight=1000, weight_used=0)
  51. db_session.add(spool)
  52. await db_session.commit()
  53. await db_session.refresh(spool)
  54. db_session.add(SpoolAssignment(spool_id=spool.id, printer_id=printer.id, ams_id=0, tray_id=1))
  55. await db_session.commit()
  56. with patch("backend.app.services.printer_manager.printer_manager.get_all_statuses") as statuses:
  57. statuses.return_value = {printer.id: _state()}
  58. resp = await async_client.get("/api/v1/inventory/assignments")
  59. assert [a["ams_label"] for a in resp.json()] == ["Desk Lite"]
  60. @pytest.mark.asyncio
  61. @pytest.mark.integration
  62. async def test_spoolman_location_shows_it(async_client: AsyncClient, printer, db_session):
  63. from backend.app.models.settings import Settings
  64. from backend.app.models.spoolman_slot_assignment import SpoolmanSlotAssignment
  65. db_session.add_all(
  66. [Settings(key="spoolman_enabled", value="true"), Settings(key="spoolman_url", value="http://localhost:7912")]
  67. )
  68. db_session.add(SpoolmanSlotAssignment(printer_id=printer.id, ams_id=0, tray_id=1, spoolman_spool_id=216))
  69. await db_session.commit()
  70. with patch("backend.app.api.routes.spoolman_inventory.printer_manager") as pm:
  71. pm.get_all_statuses.return_value = {printer.id: _state()}
  72. resp = await async_client.get("/api/v1/spoolman/inventory/slot-assignments/all")
  73. assert [a["ams_label"] for a in resp.json()] == ["Desk Lite"]