File size: 2,460 Bytes
e3fa7c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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