Skip to content

Commit 832b553

Browse files
committed
Fix: Update Session.load_by_id to use KaosPath and fix tests
This commit completes the merge resolution by: 1. Updating Session.load_by_id() to return KaosPath instead of Path for work_dir 2. Converting all test functions to async and properly setting up kaos context 3. Updating test fixtures to handle the new async Session.create() and Session.continue_() methods
1 parent 8138be5 commit 832b553

File tree

2 files changed

+75
-58
lines changed

2 files changed

+75
-58
lines changed

src/kimi_cli/session.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ def load_by_id(session_id: str) -> Session | None:
108108
# Try metadata lookup first (fast path)
109109
work_dir_str = metadata.session_to_workdir.get(session_id)
110110
if work_dir_str:
111-
work_dir = Path(work_dir_str)
111+
work_dir = KaosPath.unsafe_from_local_path(Path(work_dir_str))
112112
work_dir_meta = next(
113113
(wd for wd in metadata.work_dirs if wd.path == work_dir_str), None
114114
)
@@ -145,7 +145,7 @@ def load_by_id(session_id: str) -> Session | None:
145145
# We need to find which work_dir_meta has this sessions_dir
146146
for work_dir_meta in metadata.work_dirs:
147147
if work_dir_meta.sessions_dir == work_dir_hash_dir:
148-
work_dir = Path(work_dir_meta.path)
148+
work_dir = KaosPath.unsafe_from_local_path(Path(work_dir_meta.path))
149149
logger.debug(
150150
"Found session in filesystem: {session_id} -> {work_dir}",
151151
session_id=session_id,

tests/test_session.py

Lines changed: 73 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
from __future__ import annotations
22

3+
import os
34
from pathlib import Path
45

56
import pytest
67

8+
from kaos import current_kaos
9+
from kaos.local import LocalKaos
10+
from kaos.path import KaosPath
711
from kimi_cli.metadata import load_metadata
812
from kimi_cli.session import Session
913

@@ -25,12 +29,25 @@ def _get_share_dir() -> Path:
2529
return share_dir
2630

2731

28-
def test_session_create(isolated_share_dir: Path, tmp_path: Path):
32+
@pytest.fixture
33+
def kaos_context(tmp_path: Path):
34+
"""Set up a Kaos context for async operations."""
35+
token = current_kaos.set(LocalKaos())
36+
old_cwd = Path.cwd()
37+
os.chdir(tmp_path)
38+
try:
39+
yield
40+
finally:
41+
os.chdir(old_cwd)
42+
current_kaos.reset(token)
43+
44+
45+
async def test_session_create(kaos_context, isolated_share_dir: Path, tmp_path: Path):
2946
"""Test creating a new session."""
30-
work_dir = tmp_path / "work"
31-
work_dir.mkdir()
47+
work_dir = KaosPath.unsafe_from_local_path(tmp_path / "work")
48+
await work_dir.mkdir()
3249

33-
session = Session.create(work_dir)
50+
session = await Session.create(work_dir)
3451

3552
assert session.id is not None
3653
assert session.work_dir == work_dir
@@ -44,13 +61,13 @@ def test_session_create(isolated_share_dir: Path, tmp_path: Path):
4461
assert metadata.session_to_workdir[session.id] == str(work_dir)
4562

4663

47-
def test_session_create_multiple_sessions(isolated_share_dir: Path, tmp_path: Path):
64+
async def test_session_create_multiple_sessions(kaos_context, isolated_share_dir: Path, tmp_path: Path):
4865
"""Test creating multiple sessions for the same work directory."""
49-
work_dir = tmp_path / "work"
50-
work_dir.mkdir()
66+
work_dir = KaosPath.unsafe_from_local_path(tmp_path / "work")
67+
await work_dir.mkdir()
5168

52-
session1 = Session.create(work_dir)
53-
session2 = Session.create(work_dir)
69+
session1 = await Session.create(work_dir)
70+
session2 = await Session.create(work_dir)
5471

5572
assert session1.id != session2.id
5673
assert session1.work_dir == session2.work_dir
@@ -62,15 +79,15 @@ def test_session_create_multiple_sessions(isolated_share_dir: Path, tmp_path: Pa
6279
assert session2.id in metadata.session_to_workdir
6380

6481

65-
def test_session_create_different_work_dirs(isolated_share_dir: Path, tmp_path: Path):
82+
async def test_session_create_different_work_dirs(kaos_context, isolated_share_dir: Path, tmp_path: Path):
6683
"""Test creating sessions for different work directories."""
67-
work_dir1 = tmp_path / "work1"
68-
work_dir2 = tmp_path / "work2"
69-
work_dir1.mkdir()
70-
work_dir2.mkdir()
84+
work_dir1 = KaosPath.unsafe_from_local_path(tmp_path / "work1")
85+
work_dir2 = KaosPath.unsafe_from_local_path(tmp_path / "work2")
86+
await work_dir1.mkdir()
87+
await work_dir2.mkdir()
7188

72-
session1 = Session.create(work_dir1)
73-
session2 = Session.create(work_dir2)
89+
session1 = await Session.create(work_dir1)
90+
session2 = await Session.create(work_dir2)
7491

7592
assert session1.work_dir != session2.work_dir
7693
assert session1.id != session2.id
@@ -81,23 +98,23 @@ def test_session_create_different_work_dirs(isolated_share_dir: Path, tmp_path:
8198
assert metadata.session_to_workdir[session2.id] == str(work_dir2)
8299

83100

84-
def test_session_continue_no_previous_session(isolated_share_dir: Path, tmp_path: Path):
101+
async def test_session_continue_no_previous_session(kaos_context, isolated_share_dir: Path, tmp_path: Path):
85102
"""Test continuing when no previous session exists."""
86-
work_dir = tmp_path / "work"
87-
work_dir.mkdir()
103+
work_dir = KaosPath.unsafe_from_local_path(tmp_path / "work")
104+
await work_dir.mkdir()
88105

89-
session = Session.continue_(work_dir)
106+
session = await Session.continue_(work_dir)
90107

91108
assert session is None
92109

93110

94-
def test_session_continue_with_previous_session(isolated_share_dir: Path, tmp_path: Path):
111+
async def test_session_continue_with_previous_session(kaos_context, isolated_share_dir: Path, tmp_path: Path):
95112
"""Test continuing a previous session."""
96-
work_dir = tmp_path / "work"
97-
work_dir.mkdir()
113+
work_dir = KaosPath.unsafe_from_local_path(tmp_path / "work")
114+
await work_dir.mkdir()
98115

99116
# Create a session first
100-
created_session = Session.create(work_dir)
117+
created_session = await Session.create(work_dir)
101118

102119
# Update metadata to mark it as last session
103120
metadata = load_metadata()
@@ -109,20 +126,20 @@ def test_session_continue_with_previous_session(isolated_share_dir: Path, tmp_pa
109126
save_metadata(metadata)
110127

111128
# Now continue
112-
continued_session = Session.continue_(work_dir)
129+
continued_session = await Session.continue_(work_dir)
113130

114131
assert continued_session is not None
115132
assert continued_session.id == created_session.id
116133
assert continued_session.work_dir == created_session.work_dir
117134
assert continued_session.history_file == created_session.history_file
118135

119136

120-
def test_session_load_by_id_valid(isolated_share_dir: Path, tmp_path: Path):
137+
async def test_session_load_by_id_valid(kaos_context, isolated_share_dir: Path, tmp_path: Path):
121138
"""Test loading a session by valid ID."""
122-
work_dir = tmp_path / "work"
123-
work_dir.mkdir()
139+
work_dir = KaosPath.unsafe_from_local_path(tmp_path / "work")
140+
await work_dir.mkdir()
124141

125-
created_session = Session.create(work_dir)
142+
created_session = await Session.create(work_dir)
126143
session_id = created_session.id
127144

128145
# Create the history file (Session.create doesn't create it, only sets the path)
@@ -137,7 +154,7 @@ def test_session_load_by_id_valid(isolated_share_dir: Path, tmp_path: Path):
137154
assert loaded_session.history_file == created_session.history_file
138155

139156

140-
def test_session_load_by_id_nonexistent(isolated_share_dir: Path):
157+
def test_session_load_by_id_nonexistent(kaos_context, isolated_share_dir: Path):
141158
"""Test loading a non-existent session ID."""
142159
import uuid
143160

@@ -147,15 +164,15 @@ def test_session_load_by_id_nonexistent(isolated_share_dir: Path):
147164
assert loaded_session is None
148165

149166

150-
def test_session_load_by_id_different_work_dir(isolated_share_dir: Path, tmp_path: Path):
167+
async def test_session_load_by_id_different_work_dir(kaos_context, isolated_share_dir: Path, tmp_path: Path):
151168
"""Test loading a session from a different work directory."""
152-
work_dir1 = tmp_path / "work1"
153-
work_dir2 = tmp_path / "work2"
154-
work_dir1.mkdir()
155-
work_dir2.mkdir()
169+
work_dir1 = KaosPath.unsafe_from_local_path(tmp_path / "work1")
170+
work_dir2 = KaosPath.unsafe_from_local_path(tmp_path / "work2")
171+
await work_dir1.mkdir()
172+
await work_dir2.mkdir()
156173

157-
session1 = Session.create(work_dir1)
158-
session2 = Session.create(work_dir2)
174+
session1 = await Session.create(work_dir1)
175+
session2 = await Session.create(work_dir2)
159176

160177
# Create history files
161178
session1.history_file.parent.mkdir(parents=True, exist_ok=True)
@@ -171,13 +188,13 @@ def test_session_load_by_id_different_work_dir(isolated_share_dir: Path, tmp_pat
171188
assert loaded_session.work_dir == work_dir1 # Should use original work_dir
172189

173190

174-
def test_session_load_by_id_filesystem_fallback(isolated_share_dir: Path, tmp_path: Path):
191+
async def test_session_load_by_id_filesystem_fallback(kaos_context, isolated_share_dir: Path, tmp_path: Path):
175192
"""Test filesystem fallback when session not in metadata."""
176-
work_dir = tmp_path / "work"
177-
work_dir.mkdir()
193+
work_dir = KaosPath.unsafe_from_local_path(tmp_path / "work")
194+
await work_dir.mkdir()
178195

179196
# Create a session
180-
created_session = Session.create(work_dir)
197+
created_session = await Session.create(work_dir)
181198
session_id = created_session.id
182199

183200
# Create the history file
@@ -204,13 +221,13 @@ def test_session_load_by_id_filesystem_fallback(isolated_share_dir: Path, tmp_pa
204221
assert metadata.session_to_workdir[session_id] == str(work_dir)
205222

206223

207-
def test_session_load_by_id_history_file_missing(isolated_share_dir: Path, tmp_path: Path):
224+
async def test_session_load_by_id_history_file_missing(kaos_context, isolated_share_dir: Path, tmp_path: Path):
208225
"""Test loading a session when history file is missing."""
209-
work_dir = tmp_path / "work"
210-
work_dir.mkdir()
226+
work_dir = KaosPath.unsafe_from_local_path(tmp_path / "work")
227+
await work_dir.mkdir()
211228

212229
# Create a session
213-
created_session = Session.create(work_dir)
230+
created_session = await Session.create(work_dir)
214231
session_id = created_session.id
215232

216233
# Create and then remove history file
@@ -231,35 +248,35 @@ def test_session_load_by_id_history_file_missing(isolated_share_dir: Path, tmp_p
231248
assert loaded_session is None
232249

233250

234-
def test_session_create_truncates_existing_history(isolated_share_dir: Path, tmp_path: Path):
251+
async def test_session_create_truncates_existing_history(kaos_context, isolated_share_dir: Path, tmp_path: Path):
235252
"""Test that creating a session truncates existing history file when using same history file."""
236-
work_dir = tmp_path / "work"
237-
work_dir.mkdir()
253+
work_dir = KaosPath.unsafe_from_local_path(tmp_path / "work")
254+
await work_dir.mkdir()
238255

239256
# Create first session
240-
session1 = Session.create(work_dir)
257+
session1 = await Session.create(work_dir)
241258
history_file = session1.history_file
242259

243260
# Create the history file and write content
244261
history_file.parent.mkdir(parents=True, exist_ok=True)
245262
history_file.write_text("some history content\n")
246263

247264
# Create second session with the same history file (using _history_file parameter)
248-
session2 = Session.create(work_dir, _history_file=history_file)
265+
session2 = await Session.create(work_dir, _history_file=history_file)
249266

250267
# History file should be empty (truncated)
251268
assert history_file.exists()
252269
assert history_file.read_text() == ""
253270

254271

255-
def test_session_continue_updates_last_session_id(isolated_share_dir: Path, tmp_path: Path):
272+
async def test_session_continue_updates_last_session_id(kaos_context, isolated_share_dir: Path, tmp_path: Path):
256273
"""Test that continuing a session updates last_session_id in metadata."""
257-
work_dir = tmp_path / "work"
258-
work_dir.mkdir()
274+
work_dir = KaosPath.unsafe_from_local_path(tmp_path / "work")
275+
await work_dir.mkdir()
259276

260277
# Create multiple sessions
261-
session1 = Session.create(work_dir)
262-
session2 = Session.create(work_dir)
278+
session1 = await Session.create(work_dir)
279+
session2 = await Session.create(work_dir)
263280

264281
# Manually set last_session_id to session1
265282
metadata = load_metadata()
@@ -271,6 +288,6 @@ def test_session_continue_updates_last_session_id(isolated_share_dir: Path, tmp_
271288
save_metadata(metadata)
272289

273290
# Continue should return session1
274-
continued = Session.continue_(work_dir)
291+
continued = await Session.continue_(work_dir)
275292
assert continued is not None
276293
assert continued.id == session1.id

0 commit comments

Comments
 (0)