test_global_auto_archive_switch.py 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. """The global auto-archive switch is the master over the printers' own.
  2. Off, no printer archives a print started outside Bambuddy; on, each
  3. printer's own switch decides. The global switch used to be saved and never
  4. read, so turning it off changed nothing.
  5. """
  6. import logging
  7. import pytest
  8. from sqlalchemy import select
  9. from backend.app.models.archive import PrintArchive
  10. from backend.app.models.settings import Settings
  11. from backend.tests.integration.test_external_print_confirmation_1898 import ( # noqa: F401 (autouse fixture)
  12. SUBTASK,
  13. _clear_print_state,
  14. _drive_print_start,
  15. )
  16. async def _archives(db_session) -> list:
  17. db_session.expire_all()
  18. return list((await db_session.execute(select(PrintArchive))).scalars().all())
  19. @pytest.mark.asyncio
  20. @pytest.mark.integration
  21. async def test_global_off_archives_nothing(test_engine, db_session, printer_factory, caplog):
  22. printer = await printer_factory()
  23. db_session.add(Settings(key="auto_archive", value="false"))
  24. await db_session.commit()
  25. with caplog.at_level(logging.INFO, logger="backend.app.main"):
  26. await _drive_print_start(test_engine, printer, download_ok=False)
  27. assert await _archives(db_session) == []
  28. # The log names the switch: upgraded installs had it off without knowing,
  29. # as it did nothing before 1.3.0 (#3477).
  30. assert "global 'Auto-archive prints' switch" in caplog.text
  31. assert "auto-archive is off for printer" not in caplog.text
  32. @pytest.mark.asyncio
  33. @pytest.mark.integration
  34. async def test_global_on_lets_the_printer_decide(test_engine, db_session, printer_factory):
  35. printer = await printer_factory()
  36. db_session.add(Settings(key="auto_archive", value="true"))
  37. await db_session.commit()
  38. await _drive_print_start(test_engine, printer, download_ok=False)
  39. assert len(await _archives(db_session)) == 1
  40. @pytest.mark.asyncio
  41. @pytest.mark.integration
  42. async def test_a_printer_switched_off_stays_off_under_global_on(test_engine, db_session, printer_factory, caplog):
  43. printer = await printer_factory(auto_archive=False)
  44. printer_id = printer.id
  45. with caplog.at_level(logging.INFO, logger="backend.app.main"):
  46. await _drive_print_start(test_engine, printer, download_ok=False)
  47. assert await _archives(db_session) == []
  48. assert f"auto-archive is off for printer {printer_id}" in caplog.text
  49. assert "global 'Auto-archive prints' switch" not in caplog.text
  50. @pytest.mark.asyncio
  51. @pytest.mark.integration
  52. async def test_unset_global_lets_the_printer_decide(test_engine, db_session, printer_factory):
  53. """Installs that never saved the setting have no row; it reads as on."""
  54. printer = await printer_factory()
  55. await _drive_print_start(test_engine, printer, download_ok=False)
  56. assert len(await _archives(db_session)) == 1
  57. @pytest.mark.asyncio
  58. @pytest.mark.integration
  59. async def test_global_off_still_tracks_a_print_bambuddy_sent(test_engine, db_session, printer_factory, archive_factory):
  60. from backend.app.main import _active_prints, register_expected_print
  61. printer = await printer_factory()
  62. archive = await archive_factory(printer.id, filename=f"{SUBTASK}.gcode.3mf", status="pending", with_run=False)
  63. db_session.add(Settings(key="auto_archive", value="false"))
  64. await db_session.commit()
  65. archive_id = archive.id
  66. register_expected_print(printer.id, f"{SUBTASK}.gcode.3mf", archive_id)
  67. await _drive_print_start(test_engine, printer, download_ok=False)
  68. assert [a.id for a in await _archives(db_session)] == [archive_id]
  69. assert (await db_session.get(PrintArchive, archive_id)).status == "printing"
  70. assert archive_id in _active_prints.values()