use crate::db::Database;
use crate::db::repository::PendingRequestRepository;
#[tokio::test]
async fn pending_request_round_trips_origin_thread() {
let db = Database::connect_in_memory().await.unwrap();
db.run_migrations().await.unwrap();
let repo = PendingRequestRepository::new(db.pool().clone());
let id = uuid::Uuid::new_v4();
let session_id = uuid::Uuid::new_v4();
repo.insert(
id,
session_id,
"rebuild from OC Dev topic",
"telegram",
Some("-1004428873948"),
Some("249"),
"user",
)
.await
.unwrap();
let row = repo
.find_latest_for_session(session_id)
.await
.unwrap()
.expect("row must exist");
assert_eq!(row.channel_chat_id.as_deref(), Some("-1004428873948"));
assert_eq!(row.channel_thread_id.as_deref(), Some("249"));
}
#[tokio::test]
async fn legacy_row_without_thread_reads_back_none() {
let db = Database::connect_in_memory().await.unwrap();
db.run_migrations().await.unwrap();
let repo = PendingRequestRepository::new(db.pool().clone());
let id = uuid::Uuid::new_v4();
let session_id = uuid::Uuid::new_v4();
repo.insert(
id,
session_id,
"DM turn",
"telegram",
Some("7711740248"),
None,
"user",
)
.await
.unwrap();
let row = repo
.find_latest_for_session(session_id)
.await
.unwrap()
.expect("row must exist");
assert_eq!(row.channel_thread_id, None, "non-topic turns stay NULL");
}
#[tokio::test]
async fn thread_survives_in_interrupted_scan() {
let db = Database::connect_in_memory().await.unwrap();
db.run_migrations().await.unwrap();
let repo = PendingRequestRepository::new(db.pool().clone());
let id = uuid::Uuid::new_v4();
let session_id = uuid::Uuid::new_v4();
repo.insert(
id,
session_id,
"crashed mid-turn",
"telegram",
Some("-100"),
Some("7198"),
"user",
)
.await
.unwrap();
let rows = repo.get_interrupted().await.unwrap();
assert_eq!(rows.len(), 1);
assert_eq!(rows[0].channel_thread_id.as_deref(), Some("7198"));
}
#[tokio::test]
async fn bubble_id_round_trips_through_the_setter() {
let db = Database::connect_in_memory().await.unwrap();
db.run_migrations().await.unwrap();
let repo = PendingRequestRepository::new(db.pool().clone());
let id = uuid::Uuid::new_v4();
let session_id = uuid::Uuid::new_v4();
repo.insert(
id,
session_id,
"turn in a forum topic",
"telegram",
Some("-1004428873948"),
Some("15"),
"user",
)
.await
.unwrap();
let row = repo
.find_latest_for_session(session_id)
.await
.unwrap()
.expect("row must exist");
assert_eq!(
row.channel_message_id, None,
"no bubble until one is opened"
);
repo.set_channel_message_id_for_session(session_id, "flow:159")
.await
.unwrap();
let row = repo
.find_latest_for_session(session_id)
.await
.unwrap()
.expect("row must exist");
assert_eq!(row.channel_message_id.as_deref(), Some("flow:159"));
repo.set_channel_message_id_for_session(session_id, "flow:159")
.await
.unwrap();
repo.set_channel_message_id_for_session(session_id, "answer:161")
.await
.unwrap();
let row = repo
.find_latest_for_session(session_id)
.await
.unwrap()
.expect("row must exist");
assert_eq!(row.channel_message_id.as_deref(), Some("answer:161"));
let rows = repo.get_interrupted().await.unwrap();
assert_eq!(rows.len(), 1);
assert_eq!(rows[0].channel_message_id.as_deref(), Some("answer:161"));
}
#[tokio::test]
async fn legacy_row_without_bubble_reads_back_none() {
let db = Database::connect_in_memory().await.unwrap();
db.run_migrations().await.unwrap();
let repo = PendingRequestRepository::new(db.pool().clone());
let id = uuid::Uuid::new_v4();
let session_id = uuid::Uuid::new_v4();
repo.insert(
id,
session_id,
"tui turn, no bubble ever",
"tui",
None,
None,
"user",
)
.await
.unwrap();
let row = repo
.find_latest_for_session(session_id)
.await
.unwrap()
.expect("row must exist");
assert_eq!(row.channel_message_id, None);
let rows = repo.get_interrupted().await.unwrap();
assert_eq!(rows[0].channel_message_id, None);
}
#[test]
fn setter_does_not_touch_updated_at() {
let src = std::fs::read_to_string(format!(
"{}/src/db/repository/pending_request.rs",
env!("CARGO_MANIFEST_DIR")
))
.expect("read db/repository/pending_request.rs");
let fn_at = src
.find("pub async fn set_channel_message_id_for_session")
.expect("setter exists");
let body = &src[fn_at..];
assert!(
body.contains("SET channel_message_id = ?2 WHERE session_id = ?1"),
"the setter must write only the carried id"
);
let sql_at = body.find("conn.execute(").expect("setter SQL");
assert!(
!body[sql_at..].contains("updated_at"),
"the setter must not refresh updated_at (it drives the 24h prune)"
);
}