use crate::config::{ChannelsConfig, TelegramConfig, TelegramUserbotConfig};
fn channels_from_toml(text: &str) -> ChannelsConfig {
toml::from_str::<ChannelsConfig>(text).expect("channels config should parse")
}
fn base_channels() -> ChannelsConfig {
ChannelsConfig {
telegram: TelegramConfig::default(),
..Default::default()
}
}
#[test]
fn absent_userbot_table_is_disabled_and_dry() {
let cfg = channels_from_toml("[telegram]\nenabled = true\ntoken = \"x\"\n");
let ub = &cfg.telegram.userbot;
assert!(!ub.enabled, "userbot must default to disabled");
assert!(ub.allowed_chats.is_empty(), "no forwarding by default");
assert!(ub.api_hash.is_none() && ub.api_id.is_none() && ub.phone.is_none());
}
#[test]
fn userbot_table_parses_fully() {
let cfg = channels_from_toml(
r#"
[telegram]
enabled = true
[telegram.userbot]
enabled = true
api_id = 25625345
phone = "+254700000000"
allowed_chats = ["-1001234567890", "777"]
"#,
);
let ub = &cfg.telegram.userbot;
assert!(ub.enabled);
assert_eq!(ub.api_id, Some(25625345));
assert_eq!(ub.phone.as_deref(), Some("+254700000000"));
assert_eq!(ub.allowed_chats, vec!["-1001234567890", "777"]);
}
#[test]
fn keys_toml_overlays_userbot_secrets() {
let mut base = base_channels();
base.telegram.userbot = TelegramUserbotConfig {
enabled: true,
..Default::default()
};
let keys = channels_from_toml(
r#"
[telegram.userbot]
api_id = 25625345
api_hash = "0123456789abcdef0123456789abcdef"
phone = "+254700000000"
"#,
);
let merged = crate::config::merge_channel_keys(base, keys);
let ub = &merged.telegram.userbot;
assert!(ub.enabled, "merge must not flip enabled");
assert_eq!(ub.api_id, Some(25625345));
assert_eq!(
ub.api_hash.as_deref(),
Some("0123456789abcdef0123456789abcdef")
);
assert_eq!(ub.phone.as_deref(), Some("+254700000000"));
}
#[test]
fn empty_keys_secrets_do_not_clobber_config_values() {
let mut base = base_channels();
base.telegram.userbot = TelegramUserbotConfig {
enabled: true,
api_id: Some(1),
api_hash: Some("confighash".into()),
phone: Some("+254700000001".into()),
..Default::default()
};
let keys = channels_from_toml("[telegram.userbot]\nenabled = false\n");
let merged = crate::config::merge_channel_keys(base, keys);
let ub = &merged.telegram.userbot;
assert_eq!(ub.api_hash.as_deref(), Some("confighash"));
assert_eq!(ub.api_id, Some(1));
assert_eq!(ub.phone.as_deref(), Some("+254700000001"));
}
#[test]
fn placeholder_api_id_zero_in_keys_does_not_shadow_config_value() {
let mut base = base_channels();
base.telegram.userbot = TelegramUserbotConfig {
enabled: true,
api_id: Some(25_625_345),
..Default::default()
};
let keys = channels_from_toml("[telegram.userbot]\napi_id = 0\n");
let merged = crate::config::merge_channel_keys(base, keys);
assert_eq!(merged.telegram.userbot.api_id, Some(25_625_345));
}
#[test]
fn sentinel_api_hash_resolves_to_real_key() {
let mut base = base_channels();
base.telegram.userbot = TelegramUserbotConfig {
enabled: true,
..Default::default()
};
let keys = channels_from_toml(
r#"
[telegram.userbot]
api_hash = "__EXISTING_KEY__abcdef0123456789abcdef0123456789"
"#,
);
let merged = crate::config::merge_channel_keys(base.clone(), keys);
assert_eq!(
merged.telegram.userbot.api_hash.as_deref(),
Some("abcdef0123456789abcdef0123456789")
);
let keys_bare = channels_from_toml(
r#"
[telegram.userbot]
api_hash = "__EXISTING_KEY__"
"#,
);
let merged_bare = crate::config::merge_channel_keys(base, keys_bare);
assert!(
merged_bare.telegram.userbot.api_hash.is_none(),
"bare sentinel means unchanged, not a literal marker secret"
);
}