summaryrefslogtreecommitdiff
path: root/server/common/src
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@spawned.biz>2025-02-03 23:58:47 +0100
committerJoel Klinghed <the_jk@spawned.biz>2025-02-03 23:58:47 +0100
commitf1663e24c148421692346f7470d77b258d78b585 (patch)
tree2a44cdb4da386fcca6b6be9037dcd9ce0ac88471 /server/common/src
parent67331b851295b0067f74cd410aef7986aa6a848e (diff)
code coverage: Add tests for common
Add coverage for common as well as server. Fix fs_utils::create_dir_allow_existing to fail if entry exists but isn't a dir.
Diffstat (limited to 'server/common/src')
-rw-r--r--server/common/src/fs_utils.rs11
-rw-r--r--server/common/src/lib.rs3
-rw-r--r--server/common/src/tests.rs45
3 files changed, 57 insertions, 2 deletions
diff --git a/server/common/src/fs_utils.rs b/server/common/src/fs_utils.rs
index 7905d01..b8c8554 100644
--- a/server/common/src/fs_utils.rs
+++ b/server/common/src/fs_utils.rs
@@ -5,11 +5,18 @@ use std::path::Path;
use tokio::fs;
pub async fn create_dir_allow_existing(path: impl AsRef<Path>) -> io::Result<()> {
- match fs::create_dir(path).await {
+ match fs::create_dir(path.as_ref()).await {
Ok(_) => Ok(()),
Err(e) => {
if e.kind() == io::ErrorKind::AlreadyExists {
- Ok(())
+ match fs::metadata(path).await {
+ Ok(metadata) => if metadata.is_dir() {
+ Ok(())
+ } else {
+ Err(e)
+ }
+ Err(e) => Err(e),
+ }
} else {
Err(e)
}
diff --git a/server/common/src/lib.rs b/server/common/src/lib.rs
index a63e05b..abea52e 100644
--- a/server/common/src/lib.rs
+++ b/server/common/src/lib.rs
@@ -1,3 +1,6 @@
pub mod fs_utils;
pub mod git;
pub mod git_socket;
+
+#[cfg(test)]
+mod tests;
diff --git a/server/common/src/tests.rs b/server/common/src/tests.rs
new file mode 100644
index 0000000..540ee2d
--- /dev/null
+++ b/server/common/src/tests.rs
@@ -0,0 +1,45 @@
+use tokio::fs;
+use testdir::testdir;
+
+use crate::fs_utils;
+
+#[tokio::test]
+async fn test_fs_utils_create_dir_allow_existing() {
+ let dir = testdir!();
+ let foo = dir.join("foo");
+ assert!(fs_utils::create_dir_allow_existing(&foo).await.is_ok());
+ assert!(fs::try_exists(&foo).await.unwrap());
+ assert!(fs_utils::create_dir_allow_existing(&foo).await.is_ok());
+}
+
+#[tokio::test]
+async fn test_fs_utils_create_dir_allow_existing_file() {
+ let dir = testdir!();
+ let foo = dir.join("foo");
+ assert!(fs::write(&foo, "hello").await.is_ok());
+ assert!(fs_utils::create_dir_allow_existing(&foo).await.is_err());
+}
+
+#[tokio::test]
+async fn test_fs_utils_remove_file_allow_not_found() {
+ let dir = testdir!();
+ let foo = dir.join("foo");
+ assert!(fs_utils::remove_file_allow_not_found(&foo).await.is_ok());
+ assert!(fs::write(&foo, "hello").await.is_ok());
+ assert!(fs_utils::remove_file_allow_not_found(&foo).await.is_ok());
+ assert!(!fs::try_exists(&foo).await.unwrap());
+}
+
+#[tokio::test]
+async fn test_fs_utils_symlink_update_existing() {
+ let dir = testdir!();
+ let foo = dir.join("foo");
+ let bar = dir.join("bar");
+ let fum = dir.join("fum");
+ assert!(fs::write(&foo, "hello").await.is_ok());
+ assert!(fs_utils::symlink_update_existing(&foo, &bar).await.is_ok());
+ assert!(fs_utils::symlink_update_existing(&foo, &bar).await.is_ok());
+ assert_eq!(fs::read_link(&bar).await.unwrap(), foo);
+ assert!(fs_utils::symlink_update_existing(&fum, &bar).await.is_ok());
+ assert_eq!(fs::read_link(&bar).await.unwrap(), fum);
+}