from __future__ import annotations from adam.models import ExecutionPlan, Job, JobStatus, PlanStep from adam.commands import TrainingCommand def test_job_round_trip_preserves_enums_and_plan() -> None: job = Job( plan=ExecutionPlan( request="Check GPU", summary="Inspect resources", steps=[ PlanStep( "system_monitor", "Inspect system", "Read local sensors", {"project_name": "System check"}, ) ], ), status=JobStatus.FINISHED, progress=100, preview_path="D:/runs/preview_epoch_5.png", preview_epoch=5, preview_next_epoch=10, preview_prompt="test prompt", preview_seed=42, preview_steps=30, eta_seconds=125, estimated_completion_at="2026-08-30T23:32:00+00:00", progress_current=75, progress_total=100, progress_rate=0.75, progress_unit="step", ) restored = Job.from_dict(job.to_dict()) assert restored.status == JobStatus.FINISHED assert restored.plan.steps[0].tool_id == "system_monitor" assert restored.progress == 100 assert restored.preview_path == "D:/runs/preview_epoch_5.png" assert restored.preview_epoch == 5 assert restored.preview_next_epoch == 10 assert restored.preview_prompt == "test prompt" assert restored.preview_seed == 42 assert restored.preview_steps == 30 assert restored.eta_seconds == 125 assert restored.estimated_completion_at == "2026-08-30T23:32:00+00:00" assert restored.progress_current == 75 assert restored.progress_total == 100 assert restored.progress_rate == 0.75 assert restored.progress_unit == "step" def test_training_command_accepts_live_preview_options() -> None: command = TrainingCommand.from_dict({ "trainer": "ddpm", "dataset": "D:/data", "model_name": "Test", "epochs": 10, "training_options": { "preview_enabled": True, "preview_every": 3, "preview_prompt": "a test subject", "preview_seed": 123456789, }, }) assert command.training_options["preview_every"] == 3