#![allow(
clippy::expect_used,
clippy::panic_in_result_fn,
clippy::shadow_unrelated,
clippy::unwrap_used
)]
use zero_postgres::Error;
use zero_postgres::sync::Conn;
fn get_conn() -> Result<Conn, Error> {
let mut db_url = std::env::var("DATABASE_URL")
.unwrap_or_else(|_| "postgres://localhost/postgres".to_string());
if !db_url.contains("sslmode=") {
if db_url.contains('?') {
db_url.push_str("&sslmode=disable");
} else {
db_url.push_str("?sslmode=disable");
}
}
Conn::new(db_url.as_str())
}
#[test]
fn exec_drop_reusable_after_server_error() -> Result<(), Error> {
let mut conn = get_conn()?;
let first_err = conn
.exec_drop("SELECT 1 / $1", (0_i32,))
.expect_err("division by zero should fail");
assert!(
first_err.to_string().contains("division by zero"),
"unexpected first error: {first_err}"
);
let second_err = conn
.exec_drop("SELECT 1 / $1", (0_i32,))
.expect_err("division by zero should fail again");
assert!(
second_err.to_string().contains("division by zero"),
"unexpected second error (protocol desync?): {second_err}"
);
let rows: Vec<(i32,)> = conn.exec_collect("SELECT $1::int", (42_i32,))?;
assert_eq!(rows[0].0, 42);
Ok(())
}