test_archived_spool_slots_migration.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. """Slots still held by a spool archived before archiving released them are
  2. released by the startup migration. Idempotent."""
  3. from __future__ import annotations
  4. import pytest
  5. from sqlalchemy import text
  6. from sqlalchemy.ext.asyncio import create_async_engine
  7. from backend.app.core.database import run_migrations
  8. @pytest.fixture(autouse=True)
  9. def force_sqlite_dialect(monkeypatch):
  10. from backend.app.core import database as database_module, db_dialect
  11. monkeypatch.setattr(db_dialect, "is_sqlite", lambda: True)
  12. monkeypatch.setattr(db_dialect, "is_postgres", lambda: False)
  13. monkeypatch.setattr(database_module, "is_sqlite", lambda: True)
  14. @pytest.mark.asyncio
  15. async def test_slots_of_archived_spools_are_released_and_others_kept():
  16. from datetime import datetime, timezone
  17. from sqlalchemy.ext.asyncio import AsyncSession
  18. import backend.app.models # noqa: F401
  19. from backend.app.core.database import Base
  20. from backend.app.models import ( # noqa: F401
  21. external_link,
  22. location,
  23. print_log,
  24. print_queue,
  25. project_bom,
  26. slot_preset,
  27. spoolman_k_profile,
  28. spoolman_slot_assignment,
  29. virtual_printer,
  30. )
  31. from backend.app.models.printer import Printer
  32. from backend.app.models.spool import Spool
  33. from backend.app.models.spool_assignment import SpoolAssignment
  34. engine = create_async_engine("sqlite+aiosqlite:///:memory:", echo=False)
  35. async with engine.begin() as conn:
  36. await conn.run_sync(Base.metadata.create_all)
  37. async with AsyncSession(engine) as db:
  38. printer = Printer(name="P", serial_number="S", ip_address="1.2.3.4", access_code="x")
  39. archived = Spool(material="PLA", label_weight=1000, archived_at=datetime(2026, 1, 1, tzinfo=timezone.utc))
  40. active = Spool(material="PLA", label_weight=1000)
  41. db.add_all([printer, archived, active])
  42. await db.flush()
  43. db.add(SpoolAssignment(spool_id=archived.id, printer_id=printer.id, ams_id=0, tray_id=0))
  44. db.add(SpoolAssignment(spool_id=active.id, printer_id=printer.id, ams_id=0, tray_id=1))
  45. active_id = active.id
  46. await db.commit()
  47. for _ in range(2):
  48. async with engine.begin() as conn:
  49. await run_migrations(conn)
  50. async with engine.connect() as conn:
  51. rows = (await conn.execute(text("SELECT spool_id FROM spool_assignment"))).scalars().all()
  52. await engine.dispose()
  53. assert rows == [active_id]