1//! Host names in `jev.endpoint` resolve through hickory on the backend's 2//! own executor (contract §2), against `jev.dns_servers` when set. 3 4use std::net::Ipv4Addr; 5 6use hickory_proto::rr::RecordType; 7use support::dns::MockDns; 8use support::mock_jev::{MockJev, Reply}; 9use support::{jev_instance_with, noul}; 10 11const SELECT: &str = "SELECT jev_prob(t, 'Urgent?') FROM tickets t"; 12 13#[tokio::test(flavor = "multi_thread")] 14async fn the_endpoint_host_is_resolved() { 15 let mock = MockJev::start_for(&["jev.test"], |_| Reply::json(200, noul(0.95))).await; 16 let dns = MockDns::start(&[("jev.test", Ipv4Addr::LOCALHOST)]).await; 17 let (_pg, client) = jev_instance_with( 18 &mock, 19 &[("jev.endpoint", &mock.endpoint_via("jev.test")), ("jev.dns_servers", &dns.addr.to_string())], 20 ) 21 .await; 22 23 let row = client.query_one(SELECT, &[]).await.expect("resolved and answered"); 24 assert_eq!(row.get::<_, f64>(0), 0.95); 25 assert!( 26 dns.queries().contains(&("jev.test.".to_string(), RecordType::A)), 27 "asked: {:?}", 28 dns.queries() 29 ); 30 assert_eq!(mock.requests().len(), 1); 31} 32 33#[tokio::test(flavor = "multi_thread")] 34async fn an_unknown_host_fails_naming_it() { 35 let mock = MockJev::start(|_| Reply::json(200, noul(0.95))).await; 36 let dns = MockDns::start(&[]).await; 37 let (_pg, client) = jev_instance_with( 38 &mock, 39 &[("jev.endpoint", &mock.endpoint_via("nowhere.test")), ("jev.dns_servers", &dns.addr.to_string())], 40 ) 41 .await; 42 43 let err = client.query_one(SELECT, &[]).await.expect_err("no address"); 44 let db = err.as_db_error().expect("an ERROR"); 45 assert_eq!(db.code(), &tokio_postgres::error::SqlState::SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION); 46 assert!(db.message().contains("nowhere.test"), "{}", db.message()); 47 assert!(mock.requests().is_empty()); 48}