e45c7e529b 2026-07-31 1: use smtp2tg::mail::MailServer;
e45c7e529b 2026-07-31 2:
98c5a42df0 2026-08-01 3: use config::FileFormat::Toml;
e45c7e529b 2026-07-31 4: use stacked_errors::{
e45c7e529b 2026-07-31 5: Result,
e45c7e529b 2026-07-31 6: StackableErr,
98c5a42df0 2026-08-01 7: ensure,
98c5a42df0 2026-08-01 8: ensure_eq,
e45c7e529b 2026-07-31 9: };
e45c7e529b 2026-07-31 10:
e45c7e529b 2026-07-31 11: use tgbot::types::ChatPeerId;
98c5a42df0 2026-08-01 12:
98c5a42df0 2026-08-01 13: #[test]
98c5a42df0 2026-08-01 14: fn get_id_properly_resolves_addresses () -> Result<()> {
98c5a42df0 2026-08-01 15: let server = MailServer::new(config::Config::builder()
e45c7e529b 2026-07-31 16: .add_source(config::File::from_str(r#"
e45c7e529b 2026-07-31 17: api_key = "test-api-key"
e45c7e529b 2026-07-31 18: api_gateway = "https://api.telegram.org"
e45c7e529b 2026-07-31 19: default = 0
e45c7e529b 2026-07-31 20: fields = ["date", "from", "subject"]
e45c7e529b 2026-07-31 21: domains = ["example.com"]
e45c7e529b 2026-07-31 22:
e45c7e529b 2026-07-31 23: [recipients]
e45c7e529b 2026-07-31 24: "someone@example.com" = 1
e45c7e529b 2026-07-31 25: "root" = -1
98c5a42df0 2026-08-01 26: "#, Toml))
e45c7e529b 2026-07-31 27: .build()
98c5a42df0 2026-08-01 28: .stack()?)?;
b9af445709 2026-07-31 29: let cases = [
b9af445709 2026-07-31 30: ("someone@example.com", 1),
b9af445709 2026-07-31 31: ("someone", 0),
b9af445709 2026-07-31 32: ("root", -1),
b9af445709 2026-07-31 33: ("unknown@example.com", 0),
158c9cffc6 2026-08-01 34: ("SOMEONE@example.com", 1), // uppercase local part
158c9cffc6 2026-08-01 35: ("someone@EXAMPLE.COM", 1), // uppercase domain
40a93e9a58 2026-08-01 36: ("some.one@example.com", 0), // dot are not skipped
158c9cffc6 2026-08-01 37: ("some-one-2", 0), // Hyphens
b9af445709 2026-07-31 38: ];
b9af445709 2026-07-31 39: for (email, id) in cases {
98c5a42df0 2026-08-01 40: ensure_eq!(*server.get_id(email)?, ChatPeerId::from(id), format!("email [{email}] expected to return id [{id}]"));
f748e99b70 2026-08-01 41: }
f748e99b70 2026-08-01 42: let cases = [
f748e99b70 2026-08-01 43: "someone@otherdomain.net",
158c9cffc6 2026-08-01 44: "@example.com", // empty local part
158c9cffc6 2026-08-01 45: "some@one@example.com", // more than one '@'
158c9cffc6 2026-08-01 46: "someone@example.com.evil",
158c9cffc6 2026-08-01 47: "someone@example.org",
f748e99b70 2026-08-01 48: ];
f748e99b70 2026-08-01 49: for email in cases {
98c5a42df0 2026-08-01 50: ensure!(server.get_id(email).is_err(), format!("this email should be rejected: {email}"));
98c5a42df0 2026-08-01 51: }
98c5a42df0 2026-08-01 52: Ok(())
98c5a42df0 2026-08-01 53: }
98c5a42df0 2026-08-01 54:
98c5a42df0 2026-08-01 55: #[test]
98c5a42df0 2026-08-01 56: fn wrong_server_config () -> Result<()> {
98c5a42df0 2026-08-01 57: let configs = [
98c5a42df0 2026-08-01 58: "domains = []",
98c5a42df0 2026-08-01 59: "",
98c5a42df0 2026-08-01 60: "[recipents]\na = 1",
98c5a42df0 2026-08-01 61: r#"
98c5a42df0 2026-08-01 62: api_key = "test-api-key"
98c5a42df0 2026-08-01 63: api_gateway = "https://api.telegram.org"
98c5a42df0 2026-08-01 64: default = 0
98c5a42df0 2026-08-01 65: fields = ["date", "from", "subject"]
98c5a42df0 2026-08-01 66: domains = ["example.com"]
98c5a42df0 2026-08-01 67: # no recipients
98c5a42df0 2026-08-01 68: "#,
98c5a42df0 2026-08-01 69: r#"
98c5a42df0 2026-08-01 70: ap_key = "test-api-key" # bad one
98c5a42df0 2026-08-01 71: api_gateway = "https://api.telegram.org"
98c5a42df0 2026-08-01 72: default = 0
98c5a42df0 2026-08-01 73: fields = ["date", "from", "subject"]
98c5a42df0 2026-08-01 74: domains = ["example.com"]
98c5a42df0 2026-08-01 75:
98c5a42df0 2026-08-01 76: [recipients]
98c5a42df0 2026-08-01 77: "someone@example.com" = 1
98c5a42df0 2026-08-01 78: "root" = -1"#,
98c5a42df0 2026-08-01 79: r#"
98c5a42df0 2026-08-01 80: api_key = "test-api-key"
98c5a42df0 2026-08-01 81: api_gateway = "https://api.telegram.org"
98c5a42df0 2026-08-01 82: default = 0
98c5a42df0 2026-08-01 83: fields = ["date", "from", "subject"]
98c5a42df0 2026-08-01 84: domains = [] # empty
98c5a42df0 2026-08-01 85:
98c5a42df0 2026-08-01 86: [recipients]
98c5a42df0 2026-08-01 87: "someone@example.com" = 1
98c5a42df0 2026-08-01 88: "root" = -1"#,
98c5a42df0 2026-08-01 89: ];
98c5a42df0 2026-08-01 90: for config in configs {
98c5a42df0 2026-08-01 91: let settings = config::Config::builder()
98c5a42df0 2026-08-01 92: .add_source(config::File::from_str(config, Toml))
98c5a42df0 2026-08-01 93: .build()
98c5a42df0 2026-08-01 94: .stack()?;
98c5a42df0 2026-08-01 95: ensure!(MailServer::new(settings).is_err(), format!("this config shouldn't be valid:\n{config}"));
b9af445709 2026-07-31 96: }
98c5a42df0 2026-08-01 97:
e45c7e529b 2026-07-31 98: Ok(())
e45c7e529b 2026-07-31 99: }