use crate::brain::tools::rebuild::rebuild_deliver_target;
use crate::db::Database;
use crate::db::repository::PendingRequestRepository;
#[test]
fn channel_chats_map_to_delivery_targets() {
assert_eq!(
rebuild_deliver_target("telegram", Some("123456789"), None).as_deref(),
Some("telegram:123456789")
);
assert_eq!(
rebuild_deliver_target("discord", Some("987654321"), None).as_deref(),
Some("discord:987654321")
);
assert_eq!(
rebuild_deliver_target("slack", Some("C0123ABC"), None).as_deref(),
Some("slack:C0123ABC")
);
}
#[test]
fn telegram_topic_origin_rides_the_1451_grammar() {
assert_eq!(
rebuild_deliver_target("telegram", Some("-1004428873948"), Some("249")).as_deref(),
Some("telegram:-1004428873948:249")
);
assert_eq!(
rebuild_deliver_target("telegram", Some("123"), Some("")).as_deref(),
Some("telegram:123")
);
assert_eq!(
rebuild_deliver_target("telegram", Some("123"), Some(" ")).as_deref(),
Some("telegram:123")
);
assert_eq!(
rebuild_deliver_target("discord", Some("987"), Some("249")).as_deref(),
Some("discord:987")
);
}
#[test]
fn tui_and_unsupported_channels_map_to_none() {
assert!(rebuild_deliver_target("tui", None, None).is_none());
assert!(rebuild_deliver_target("tui", Some("ignored"), None).is_none());
assert!(rebuild_deliver_target("whatsapp", Some("15551234567"), None).is_none());
}
#[test]
fn missing_or_empty_chat_id_maps_to_none() {
assert!(rebuild_deliver_target("telegram", None, None).is_none());
assert!(rebuild_deliver_target("telegram", Some(""), None).is_none());
assert!(rebuild_deliver_target("telegram", Some(" "), None).is_none());
}
#[tokio::test]
async fn find_latest_for_session_returns_the_current_turn_row() {
let db = Database::connect_in_memory().await.unwrap();
db.run_migrations().await.unwrap();
let repo = PendingRequestRepository::new(db.pool().clone());
let session_id = uuid::Uuid::new_v4();
repo.insert(
uuid::Uuid::new_v4(),
session_id,
"please rebuild yourself",
"telegram",
Some("123456789"),
None,
"user",
)
.await
.unwrap();
let row = repo
.find_latest_for_session(session_id)
.await
.unwrap()
.expect("in-flight row must be found");
assert_eq!(row.channel, "telegram");
assert_eq!(row.channel_chat_id.as_deref(), Some("123456789"));
assert_eq!(
rebuild_deliver_target(
&row.channel,
row.channel_chat_id.as_deref(),
row.channel_thread_id.as_deref()
)
.as_deref(),
Some("telegram:123456789")
);
}
#[tokio::test]
async fn rebuild_from_a_topic_targets_that_topic_end_to_end() {
let db = Database::connect_in_memory().await.unwrap();
db.run_migrations().await.unwrap();
let repo = PendingRequestRepository::new(db.pool().clone());
let session_id = uuid::Uuid::new_v4();
repo.insert(
uuid::Uuid::new_v4(),
session_id,
"rebuild from OC Dev",
"telegram",
Some("-1004428873948"),
Some("249"),
"user",
)
.await
.unwrap();
let row = repo
.find_latest_for_session(session_id)
.await
.unwrap()
.expect("in-flight row must be found");
assert_eq!(
rebuild_deliver_target(
&row.channel,
row.channel_chat_id.as_deref(),
row.channel_thread_id.as_deref()
)
.as_deref(),
Some("telegram:-1004428873948:249")
);
}
#[tokio::test]
async fn find_latest_for_session_none_when_no_row() {
let db = Database::connect_in_memory().await.unwrap();
db.run_migrations().await.unwrap();
let repo = PendingRequestRepository::new(db.pool().clone());
let row = repo
.find_latest_for_session(uuid::Uuid::new_v4())
.await
.unwrap();
assert!(row.is_none());
}