Skip to content

Commit e51dc58

Browse files
committed
test: add tests to improve code coverage
1 parent c2cf848 commit e51dc58

File tree

4 files changed

+126
-1
lines changed

4 files changed

+126
-1
lines changed

postgresql_archive/src/error.rs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,64 @@ impl From<anyhow::Error> for ArchiveError {
7070
ArchiveError::Unexpected(error.to_string())
7171
}
7272
}
73+
74+
/// These are relatively low value tests; they are here to reduce the coverage gap and
75+
/// ensure that the error conversions are working as expected.
76+
#[cfg(test)]
77+
mod test {
78+
use super::*;
79+
use std::path::PathBuf;
80+
use std::str::FromStr;
81+
82+
#[test]
83+
fn test_from_regex_error() {
84+
let regex_error = regex::Error::Syntax("test".to_string());
85+
let error = ArchiveError::from(regex_error);
86+
assert_eq!(error.to_string(), "test");
87+
}
88+
89+
#[tokio::test]
90+
async fn test_from_reqwest_error() {
91+
let result = reqwest::get("https://a.com").await;
92+
assert!(result.is_err());
93+
if let Err(error) = result {
94+
let error = ArchiveError::from(error);
95+
assert!(error.to_string().contains("https://a.com"));
96+
}
97+
}
98+
99+
#[test]
100+
fn test_from_io_error() {
101+
let io_error = std::io::Error::new(std::io::ErrorKind::NotFound, "test");
102+
let error = ArchiveError::from(io_error);
103+
assert_eq!(error.to_string(), "test");
104+
}
105+
106+
#[test]
107+
fn test_from_parse_int_error() {
108+
let result = u64::from_str("test");
109+
assert!(result.is_err());
110+
if let Err(error) = result {
111+
let error = ArchiveError::from(error);
112+
assert_eq!(error.to_string(), "invalid digit found in string");
113+
}
114+
}
115+
116+
#[test]
117+
fn test_from_strip_prefix_error() {
118+
let path = PathBuf::from("test");
119+
let result = path.strip_prefix("foo");
120+
assert!(result.is_err());
121+
if let Err(error) = result {
122+
let error = ArchiveError::from(error);
123+
assert_eq!(error.to_string(), "prefix not found");
124+
}
125+
}
126+
127+
#[test]
128+
fn test_from_anyhow_error() {
129+
let anyhow_error = anyhow::Error::msg("test");
130+
let error = ArchiveError::from(anyhow_error);
131+
assert_eq!(error.to_string(), "test");
132+
}
133+
}

postgresql_embedded/src/blocking/mod.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,16 @@ impl PostgreSQL {
8282
.block_on(async move { self.inner.drop_database(database_name).await })
8383
}
8484
}
85+
86+
#[cfg(test)]
87+
mod test {
88+
use super::*;
89+
90+
#[test]
91+
fn test_postgresql() {
92+
let version = Version::new(16, Some(2), Some(0));
93+
let postgresql = PostgreSQL::new(version, Settings::default());
94+
assert!(vec!(Status::Stopped, Status::Installed).contains(&postgresql.status()));
95+
assert_eq!(postgresql.version(), &version);
96+
}
97+
}

postgresql_embedded/src/error.rs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,54 @@ impl From<tokio::time::error::Elapsed> for EmbeddedError {
7474
EmbeddedError::TimeoutError(error.into())
7575
}
7676
}
77+
78+
/// These are relatively low value tests; they are here to reduce the coverage gap and
79+
/// ensure that the error conversions are working as expected.
80+
#[cfg(test)]
81+
mod test {
82+
use super::*;
83+
use std::time::Duration;
84+
use tokio::time::timeout;
85+
86+
#[test]
87+
fn test_from_archive_error() {
88+
let archive_error = ArchiveError::ReleaseNotFound("test".to_string());
89+
let error = EmbeddedError::from(archive_error);
90+
assert_eq!(error.to_string(), "release not found for version [test]");
91+
}
92+
93+
#[test]
94+
fn test_from_io_error() {
95+
let io_error = std::io::Error::new(std::io::ErrorKind::Other, "test");
96+
let error = EmbeddedError::from(io_error);
97+
assert_eq!(error.to_string(), "test");
98+
}
99+
100+
#[test]
101+
fn test_from_utf8_error() {
102+
let invalid_utf8: Vec<u8> = vec![0, 159, 146, 150];
103+
let result = String::from_utf8(invalid_utf8);
104+
assert!(result.is_err());
105+
if let Err(error) = result {
106+
let error = EmbeddedError::from(error);
107+
assert_eq!(
108+
error.to_string(),
109+
"invalid utf-8 sequence of 1 bytes from index 1"
110+
);
111+
}
112+
}
113+
114+
#[cfg(feature = "tokio")]
115+
#[tokio::test]
116+
async fn test_from_elapsed_error() {
117+
let result = timeout(Duration::from_nanos(1), async {
118+
tokio::time::sleep(Duration::from_millis(1)).await;
119+
})
120+
.await;
121+
assert!(result.is_err());
122+
if let Err(elapsed_error) = result {
123+
let error = EmbeddedError::from(elapsed_error);
124+
assert_eq!(error.to_string(), "deadline has elapsed");
125+
}
126+
}
127+
}

postgresql_embedded/src/settings.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::path::PathBuf;
77
use std::time::Duration;
88

99
/// Database settings
10-
#[derive(Clone, Debug)]
10+
#[derive(Clone, Debug, PartialEq, PartialOrd)]
1111
pub struct Settings {
1212
/// PostgreSQL installation directory
1313
pub installation_dir: PathBuf,

0 commit comments

Comments
 (0)