use std::time::Duration;
use oxisql_postgres::{parse_pg_conn_str, PgConnection, PgConnectionBuilder, TlsMode};
#[test]
fn tls_mode_disabled_compiles() {
let mode = TlsMode::Disabled;
match mode {
TlsMode::Disabled => {}
TlsMode::Rustls(_) => panic!("unexpected variant"),
}
}
#[test]
fn tls_mode_rustls_constructs() {
let root_store = oxitls::webpki_root_certs();
let cfg = oxitls::client_config(root_store).expect("client_config");
let mode = TlsMode::Rustls(cfg);
match mode {
TlsMode::Rustls(_) => {}
TlsMode::Disabled => panic!("unexpected variant"),
}
}
#[test]
fn parse_kv_full() {
let p = parse_pg_conn_str("host=myhost port=5433 dbname=testdb user=admin").unwrap();
assert_eq!(p.host, "myhost");
assert_eq!(p.port, 5433);
assert_eq!(p.dbname, Some("testdb".to_string()));
assert_eq!(p.user, Some("admin".to_string()));
}
#[test]
fn parse_kv_hostaddr() {
let p = parse_pg_conn_str("hostaddr=10.0.0.1").unwrap();
assert_eq!(p.host, "10.0.0.1");
assert_eq!(p.port, 5432); }
#[test]
fn parse_kv_defaults() {
let p = parse_pg_conn_str("").unwrap();
assert_eq!(p.host, "localhost");
assert_eq!(p.port, 5432);
assert_eq!(p.dbname, None);
assert_eq!(p.user, None);
}
#[test]
fn parse_kv_unknown_keys_ignored() {
let p = parse_pg_conn_str(
"host=db port=5432 dbname=prod user=alice password=secret sslmode=require",
)
.unwrap();
assert_eq!(p.host, "db");
assert_eq!(p.dbname, Some("prod".to_string()));
assert_eq!(p.user, Some("alice".to_string()));
}
#[test]
fn parse_kv_bad_port_is_error() {
assert!(parse_pg_conn_str("host=localhost port=notanumber").is_err());
}
#[test]
fn parse_uri_full() {
let p = parse_pg_conn_str("postgres://alice:secret@dbhost:5433/mydb").unwrap();
assert_eq!(p.host, "dbhost");
assert_eq!(p.port, 5433);
assert_eq!(p.dbname, Some("mydb".to_string()));
assert_eq!(p.user, Some("alice".to_string()));
}
#[test]
fn parse_uri_postgresql_scheme() {
let p = parse_pg_conn_str("postgresql://user@host/db").unwrap();
assert_eq!(p.host, "host");
assert_eq!(p.dbname, Some("db".to_string()));
assert_eq!(p.user, Some("user".to_string()));
assert_eq!(p.port, 5432); }
#[test]
fn parse_uri_host_and_db_only() {
let p = parse_pg_conn_str("postgres://somehost/somedb").unwrap();
assert_eq!(p.host, "somehost");
assert_eq!(p.port, 5432);
assert_eq!(p.dbname, Some("somedb".to_string()));
assert_eq!(p.user, None);
}
#[test]
fn parse_uri_host_only() {
let p = parse_pg_conn_str("postgres://myhost").unwrap();
assert_eq!(p.host, "myhost");
assert_eq!(p.port, 5432);
assert_eq!(p.dbname, None);
}
#[test]
fn parse_uri_bad_port_is_error() {
assert!(parse_pg_conn_str("postgres://host:badport/db").is_err());
}
#[test]
fn connect_with_timeout_signature_compiles() {
async fn _check(
uri: &str,
tls: TlsMode,
dur: Duration,
) -> Result<PgConnection, oxisql_postgres::PgError> {
PgConnection::connect_with_timeout(uri, tls, dur).await
}
let _ = std::mem::size_of_val(&_check);
}
#[test]
fn test_pg_builder_tls_skip_verify_no_panic() {
let _builder = PgConnectionBuilder::new()
.host("localhost")
.port(5432)
.dbname("test")
.tls_skip_verify()
.expect("tls_skip_verify should succeed");
}
#[test]
fn test_pg_builder_tls_with_ca_pem_no_panic() {
let fake_pem = b"-----BEGIN CERTIFICATE-----\nZg==\n-----END CERTIFICATE-----\n".to_vec();
let _result = PgConnectionBuilder::new()
.host("localhost")
.port(5432)
.dbname("test")
.tls_with_ca_pem(fake_pem);
}
#[ignore]
#[tokio::test]
async fn test_pg_tls_live_connection() {
use oxisql_core::Connection;
let url = match std::env::var("POSTGRES_TLS_URL") {
Ok(u) => u,
Err(_) => {
eprintln!("POSTGRES_TLS_URL not set — skipping live TLS test");
return;
}
};
let conn = PgConnection::connect(&url, TlsMode::skip_verify().expect("skip_verify"))
.await
.expect("connect with TLS skip_verify");
conn.ping().await.expect("ping over TLS");
}
#[test]
fn test_pg_is_read_only_query_select_is_true() {
assert!(PgConnection::is_read_only_query("SELECT 1"));
}
#[test]
fn test_pg_is_read_only_query_delete_is_false() {
assert!(!PgConnection::is_read_only_query("DELETE FROM t"));
}
#[test]
fn test_pg_is_read_only_query_insert_is_false() {
assert!(!PgConnection::is_read_only_query(
"INSERT INTO t VALUES (1)"
));
}
#[test]
fn test_pg_is_read_only_query_unparseable_returns_false() {
assert!(!PgConnection::is_read_only_query("@@@NOT VALID SQL@@@"));
}
#[test]
fn test_pg_normalize_query_collapses_whitespace() {
let n = PgConnection::normalize_query("SELECT id FROM t");
assert!(!n.is_empty());
assert!(!n.contains(" "));
}
#[test]
fn test_pg_normalize_query_empty_returns_empty() {
assert!(PgConnection::normalize_query("").is_empty());
}