Skip to content

Commit 346772a

Browse files
test: add exclude_id and 0-message filtering coverage; cargo fmt
1 parent ef392e5 commit 346772a

1 file changed

Lines changed: 85 additions & 12 deletions

File tree

rust/crates/runtime/src/session_control.rs

Lines changed: 85 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -201,18 +201,12 @@ impl SessionStore {
201201
}
202202
// Distinguish between "no sessions at all" and "sessions exist but
203203
// all are empty" so the user gets a clear signal about what to do.
204-
let has_any_session = self
205-
.list_sessions()?
206-
.iter()
207-
.any(|s| s.id != exclude)
208-
|| self
209-
.scan_global_sessions()?
210-
.iter()
211-
.any(|s| s.id != exclude);
204+
let has_any_session = self.list_sessions()?.iter().any(|s| s.id != exclude)
205+
|| self.scan_global_sessions()?.iter().any(|s| s.id != exclude);
212206
if has_any_session {
213-
return Err(SessionControlError::Format(
214-
format_all_sessions_empty(&self.sessions_root),
215-
));
207+
return Err(SessionControlError::Format(format_all_sessions_empty(
208+
&self.sessions_root,
209+
)));
216210
}
217211
Err(SessionControlError::Format(format_no_managed_sessions(
218212
&self.sessions_root,
@@ -1308,7 +1302,10 @@ mod tests {
13081302

13091303
// when — latest_session should fail with the "all sessions empty" message
13101304
let result = store.latest_session();
1311-
assert!(result.is_err(), "latest_session should fail when all sessions are empty");
1305+
assert!(
1306+
result.is_err(),
1307+
"latest_session should fail when all sessions are empty"
1308+
);
13121309
let err_msg = result.unwrap_err().to_string();
13131310
assert!(
13141311
err_msg.contains("all sessions are empty"),
@@ -1322,6 +1319,82 @@ mod tests {
13221319
fs::remove_dir_all(base).expect("temp dir should clean up");
13231320
}
13241321

1322+
#[test]
1323+
fn latest_session_excluding_skips_excluded_id_and_returns_previous() {
1324+
// given — two sessions WITH messages, newest excluded
1325+
let base = temp_dir();
1326+
fs::create_dir_all(&base).expect("base dir should exist");
1327+
let store = SessionStore::from_cwd(&base).expect("store should build");
1328+
let older = persist_session_via_store(&store, "older work");
1329+
wait_for_next_millisecond();
1330+
let newer = persist_session_via_store(&store, "newer work");
1331+
1332+
// when — exclude the newest session
1333+
let latest = store
1334+
.latest_session_excluding(Some(&newer.session_id))
1335+
.expect("latest excluding newest should resolve");
1336+
1337+
// then — the older session wins because the newest is skipped
1338+
assert_eq!(
1339+
latest.id, older.session_id,
1340+
"excluded id must be skipped, returning the previous session"
1341+
);
1342+
fs::remove_dir_all(base).expect("temp dir should clean up");
1343+
}
1344+
1345+
#[test]
1346+
fn latest_session_filters_out_zero_message_sessions() {
1347+
// given — one empty (0-message) session and one non-empty session
1348+
let base = temp_dir();
1349+
fs::create_dir_all(&base).expect("base dir should exist");
1350+
let store = SessionStore::from_cwd(&base).expect("store should build");
1351+
1352+
let empty_handle = store.create_handle("empty-session");
1353+
Session::new()
1354+
.with_persistence_path(empty_handle.path.clone())
1355+
.save_to_path(&empty_handle.path)
1356+
.expect("empty session should save");
1357+
wait_for_next_millisecond();
1358+
let non_empty = persist_session_via_store(&store, "real conversation");
1359+
1360+
// when
1361+
let latest = store.latest_session().expect("latest should resolve");
1362+
1363+
// then — the non-empty session wins; the 0-message one is filtered out
1364+
assert_eq!(
1365+
latest.id, non_empty.session_id,
1366+
"0-message session must be filtered out, non-empty session wins"
1367+
);
1368+
assert!(
1369+
latest.message_count > 0,
1370+
"resolved session must have messages"
1371+
);
1372+
fs::remove_dir_all(base).expect("temp dir should clean up");
1373+
}
1374+
1375+
#[test]
1376+
fn resolve_reference_excluding_latest_skips_excluded_id() {
1377+
// given — two sessions WITH messages
1378+
let base = temp_dir();
1379+
fs::create_dir_all(&base).expect("base dir should exist");
1380+
let store = SessionStore::from_cwd(&base).expect("store should build");
1381+
let older = persist_session_via_store(&store, "older work");
1382+
wait_for_next_millisecond();
1383+
let newer = persist_session_via_store(&store, "newer work");
1384+
1385+
// when — resolve the "latest" alias while excluding the newest session
1386+
let handle = store
1387+
.resolve_reference_excluding("latest", Some(&newer.session_id))
1388+
.expect("latest alias excluding newest should resolve");
1389+
1390+
// then — the excluded id is skipped, so the older session resolves
1391+
assert_eq!(
1392+
handle.id, older.session_id,
1393+
"excluded id must be skipped when resolving the latest alias"
1394+
);
1395+
fs::remove_dir_all(base).expect("temp dir should clean up");
1396+
}
1397+
13251398
#[test]
13261399
fn session_exists_and_delete_are_scoped_to_workspace_store() {
13271400
// given

0 commit comments

Comments
 (0)