test_h3c_queue_tray_ids_migration.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. """Queued H3C jobs move from the AMS-HT-range ids 128 + k to Studio's 28 + k, once.
  2. Bambuddy without H3C support numbered the AMS 3H (unit 32) as 32 * 4 + k, so a
  3. job queued for an H3C then carries 128-136. Other printers' jobs keep theirs.
  4. """
  5. import json
  6. import pytest
  7. from sqlalchemy import select, text
  8. from sqlalchemy.ext.asyncio import async_sessionmaker
  9. from backend.app.core.database import _migrate_h3c_queue_tray_ids
  10. from backend.app.models.library import LibraryFile
  11. from backend.app.models.print_queue import PrintQueueItem, PrintQueueVariant
  12. from backend.app.models.printer import Printer
  13. FLAG = "_migrate_h3c_queue_tray_ids_done"
  14. async def _seed(engine) -> dict[str, int]:
  15. maker = async_sessionmaker(engine, expire_on_commit=False)
  16. async with maker() as db:
  17. h3c = Printer(name="H3C", serial_number="SN-Q-H3C", ip_address="192.0.2.30", access_code="1", model="N10")
  18. h2d = Printer(name="H2D", serial_number="SN-Q-H2D", ip_address="192.0.2.31", access_code="1", model="H2D")
  19. db.add_all([h3c, h2d])
  20. await db.flush()
  21. items = {
  22. "h3c": PrintQueueItem(printer_id=h3c.id, ams_mapping=json.dumps([128, 136, -1, 254, 3])),
  23. "model": PrintQueueItem(target_model="H3C", ams_mapping=json.dumps([130])),
  24. "h2d": PrintQueueItem(printer_id=h2d.id, ams_mapping=json.dumps([128, 129])),
  25. "none": PrintQueueItem(printer_id=h3c.id, ams_mapping=None),
  26. }
  27. db.add_all(items.values())
  28. await db.flush()
  29. library_file = LibraryFile(filename="a.3mf", file_path="a.3mf", file_type="3mf", file_size=1)
  30. db.add(library_file)
  31. await db.flush()
  32. variants = {
  33. "v_h3c": PrintQueueVariant(
  34. queue_item_id=items["model"].id,
  35. library_file_id=library_file.id,
  36. target_model="H3C",
  37. ams_mapping=json.dumps([131, 32]),
  38. ),
  39. "v_h2d": PrintQueueVariant(
  40. queue_item_id=items["model"].id,
  41. library_file_id=library_file.id,
  42. target_model="H2D",
  43. ams_mapping=json.dumps([131]),
  44. ),
  45. }
  46. db.add_all(variants.values())
  47. await db.commit()
  48. return {**{k: v.id for k, v in items.items()}, **{k: v.id for k, v in variants.items()}}
  49. async def _mappings(engine) -> dict[tuple[str, int], list | None]:
  50. maker = async_sessionmaker(engine)
  51. async with maker() as db:
  52. out: dict[tuple[str, int], list | None] = {}
  53. for model, name in ((PrintQueueItem, "q"), (PrintQueueVariant, "v")):
  54. for row_id, raw in (await db.execute(select(model.id, model.ams_mapping))).tuples():
  55. out[(name, row_id)] = json.loads(raw) if raw else None
  56. return out
  57. async def _run(engine) -> None:
  58. async with engine.begin() as conn:
  59. await _migrate_h3c_queue_tray_ids(conn)
  60. @pytest.mark.asyncio
  61. async def test_h3c_jobs_are_renumbered_and_others_kept(test_engine):
  62. ids = await _seed(test_engine)
  63. await _run(test_engine)
  64. got = await _mappings(test_engine)
  65. assert got[("q", ids["h3c"])] == [28, 36, -1, 254, 3]
  66. assert got[("q", ids["model"])] == [30]
  67. assert got[("q", ids["h2d"])] == [128, 129]
  68. assert got[("q", ids["none"])] is None
  69. assert got[("v", ids["v_h3c"])] == [31, 32]
  70. assert got[("v", ids["v_h2d"])] == [131]
  71. @pytest.mark.asyncio
  72. async def test_it_runs_once(test_engine):
  73. ids = await _seed(test_engine)
  74. await _run(test_engine)
  75. async with test_engine.begin() as conn:
  76. flag = (await conn.execute(text('SELECT value FROM settings WHERE "key" = :k'), {"k": FLAG})).scalar_one()
  77. assert flag == "true"
  78. await conn.execute(text("UPDATE print_queue SET ams_mapping = '[129]' WHERE id = :id"), {"id": ids["h3c"]})
  79. await _run(test_engine)
  80. assert (await _mappings(test_engine))[("q", ids["h3c"])] == [129]