80 lines
2.6 KiB
Python
80 lines
2.6 KiB
Python
"""Szenarien für einen physischen Druck = ein Lauf (ohne DB, mit Mocks)."""
|
|
|
|
import os
|
|
import unittest
|
|
from datetime import datetime, timedelta, timezone
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
from grotti import jobs
|
|
|
|
|
|
class SyncOneJobShellTests(unittest.TestCase):
|
|
def test_empty_shell_skipped(self):
|
|
conn = MagicMock()
|
|
printer = {"host": "h", "name": "P"}
|
|
job = {
|
|
"job_id": "000041",
|
|
"filename": "a.gcode",
|
|
"status": "in_progress",
|
|
"start_time": 1000,
|
|
"end_time": None,
|
|
"print_duration": 0,
|
|
"total_duration": 0,
|
|
"metadata": {},
|
|
}
|
|
self.assertEqual(jobs._sync_one_job(conn, {"energy": {}}, printer, job), 0)
|
|
conn.execute.assert_not_called()
|
|
|
|
|
|
class FoldProofIntegrationLike(unittest.TestCase):
|
|
def test_fold_requires_duration_proof(self):
|
|
end = datetime(2026, 10, 25, 5, 48, 27, tzinfo=timezone.utc)
|
|
start = end + timedelta(milliseconds=40)
|
|
pred = {
|
|
"id": 1,
|
|
"ended_at": end,
|
|
"duration_s": 11711,
|
|
"moonraker_job_id": "000040",
|
|
"verdict": "",
|
|
}
|
|
conn = MagicMock()
|
|
conn.execute.return_value.fetchone.return_value = None
|
|
with patch("grotti.jobs.store.find_resume_predecessor", return_value=pred), \
|
|
patch("grotti.jobs.store.remember_run_job"), \
|
|
patch("grotti.jobs.store.move_run_jobs"), \
|
|
patch("grotti.jobs.store.set_printer_active_run"), \
|
|
patch("grotti.jobs.undo_deduction"):
|
|
# Frischer Neustart (Dauer 12) — kein Fold
|
|
self.assertIsNone(jobs.fold_filament_resume(
|
|
conn, "h", "a.gcode", "000041", start, print_duration_s=12
|
|
))
|
|
# Fortgesetzte Dauer — Fold
|
|
self.assertEqual(
|
|
jobs.fold_filament_resume(
|
|
conn, "h", "a.gcode", "000041", start, print_duration_s=11711
|
|
),
|
|
1,
|
|
)
|
|
|
|
|
|
@unittest.skipUnless(os.environ.get("GROTTI_TEST_DB"), "GROTTI_TEST_DB nicht gesetzt")
|
|
class LiveDbScenarios(unittest.TestCase):
|
|
"""Gegen echte Test-DB: GROTTI_TEST_DB=postgresql://…"""
|
|
|
|
def setUp(self):
|
|
import psycopg
|
|
from psycopg.rows import dict_row
|
|
|
|
self.conn = psycopg.connect(os.environ["GROTTI_TEST_DB"], row_factory=dict_row)
|
|
|
|
def tearDown(self):
|
|
self.conn.rollback()
|
|
self.conn.close()
|
|
|
|
def test_connection(self):
|
|
self.assertTrue(self.conn.execute("SELECT 1").fetchone())
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|