import pytest from unittest.mock import MagicMock from app.api.schedule import get_schedule, save_schedule, get_presets, ScheduleRequest def test_get_schedule_default(): mock_user = MagicMock() mock_user.schedule_json = None result = get_schedule(current_user=mock_user, db=MagicMock()) assert result["is_default"] is True assert result["schedule"]["lifestyle"] == "student" assert "daily_minutes" in result["schedule"] def test_get_schedule_custom(): mock_user = MagicMock() mock_user.schedule_json = {"lifestyle": "job", "blocks": {"monday": [{"start": "10:00", "end": "12:00", "label": "Work"}]}} result = get_schedule(current_user=mock_user, db=MagicMock()) assert result["is_default"] is False assert result["schedule"]["lifestyle"] == "job" assert result["schedule"]["daily_minutes"]["monday"] == 120 def test_save_schedule_with_custom_blocks(): mock_user = MagicMock() mock_db = MagicMock() req = ScheduleRequest( lifestyle="job", sleep_time="22:00", wake_time="06:00", blocks={"monday": [{"start": "08:00", "end": "09:00", "label": "Read"}]} ) # Simulate Pydantic setting explicitly req.model_fields_set.add("blocks") result = save_schedule(req, current_user=mock_user, db=mock_db) assert result["message"] == "Schedule saved!" assert len(result["schedule"]["blocks"]["monday"]) == 1 assert result["schedule"]["blocks"]["monday"][0]["label"] == "Read" mock_db.commit.assert_called_once() def test_save_schedule_fallback_to_preset(): mock_user = MagicMock() mock_db = MagicMock() req = ScheduleRequest( lifestyle="student", sleep_time="22:00", wake_time="06:00" ) # blocks not in model_fields_set result = save_schedule(req, current_user=mock_user, db=mock_db) # Should populate with student preset assert len(result["schedule"]["blocks"]["monday"]) > 0 def test_save_schedule_explicit_empty_clears_schedule(): mock_user = MagicMock() mock_db = MagicMock() req = ScheduleRequest( lifestyle="student", sleep_time="22:00", wake_time="06:00", blocks={} ) # user explicitly passed empty blocks to clear their schedule req.model_fields_set.add("blocks") result = save_schedule(req, current_user=mock_user, db=mock_db) # Should not fallback to student preset assert result["schedule"]["blocks"] == {} def test_get_presets(): result = get_presets() assert "student" in result["presets"] assert "job" in result["presets"] assert result["presets"]["student"]["avg_daily_min"] > 0