| from datetime import datetime, timedelta |
| from zoneinfo import ZoneInfo |
|
|
| import pytest |
|
|
| from database.database_layer import Database, DatabaseError |
| from core.domain import PlanBlock, PlanDraft, Priority, TaskCreate, TaskStatus |
|
|
|
|
| TZ = ZoneInfo("Europe/Istanbul") |
|
|
|
|
| @pytest.fixture |
| def database(tmp_path): |
| db = Database(tmp_path / "planner.db") |
| db.initialize() |
| return db |
|
|
|
|
| def make_task(title: str = "Sunum") -> TaskCreate: |
| return TaskCreate( |
| title=title, |
| deadline=datetime(2026, 8, 7, 17, 0, tzinfo=TZ), |
| estimated_minutes=120, |
| priority=Priority.HIGH, |
| ) |
|
|
|
|
| def test_crud_and_session_isolation(database): |
| task = database.create_task("session-a", make_task()) |
|
|
| assert [item.id for item in database.list_tasks("session-a")] == [task.id] |
| assert database.list_tasks("session-b") == [] |
| assert database.get_task("session-b", task.id) is None |
|
|
| completed = database.update_task_status( |
| "session-a", task.id, TaskStatus.COMPLETED |
| ) |
| assert completed.status is TaskStatus.COMPLETED |
|
|
| with pytest.raises(DatabaseError): |
| database.update_task_status("session-b", task.id, TaskStatus.ACTIVE) |
|
|
|
|
| def test_plan_is_saved_atomically(database): |
| task = database.create_task("session-a", make_task()) |
| start = datetime(2026, 8, 3, 9, 0, tzinfo=TZ) |
| draft = PlanDraft( |
| week_start=datetime(2026, 8, 3, tzinfo=TZ), |
| blocks=[ |
| PlanBlock( |
| task_id=task.id, |
| title=task.title, |
| start=start, |
| end=start + timedelta(minutes=120), |
| ) |
| ], |
| unscheduled=[], |
| ) |
|
|
| saved = database.save_plan("session-a", draft) |
|
|
| assert saved[0].scheduled_start == start |
| assert saved[0].scheduled_end == start + timedelta(minutes=120) |
|
|
|
|
| def test_plan_rejects_task_from_another_session(database): |
| task = database.create_task("session-a", make_task()) |
| start = datetime(2026, 8, 3, 9, 0, tzinfo=TZ) |
| draft = PlanDraft( |
| week_start=datetime(2026, 8, 3, tzinfo=TZ), |
| blocks=[ |
| PlanBlock( |
| task_id=task.id, |
| title=task.title, |
| start=start, |
| end=start + timedelta(minutes=120), |
| ) |
| ], |
| unscheduled=[], |
| ) |
|
|
| with pytest.raises(DatabaseError): |
| database.save_plan("session-b", draft) |
|
|
| assert database.get_task("session-a", task.id).scheduled_start is None |
|
|