summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRadosław Kot <rdkt13@gmail.com>2021-06-26 15:32:57 +0200
committerRadosław Kot <rdkt13@gmail.com>2021-07-03 20:30:21 +0200
commitf8cef64efbcabc399c075788e2a835b9a3267c6c (patch)
tree613365097143c8b3d940fa7606208f85ff8531eb
parentf4de34eefe95cead9527557abcfddc2648d30278 (diff)
Add test for async builder
Signed-off-by: Matthias Beyer <mail@beyermatthias.de> Reviewed-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r--tests/Settings.json1
-rw-r--r--tests/async_builder.rs153
2 files changed, 154 insertions, 0 deletions
diff --git a/tests/Settings.json b/tests/Settings.json
index c8b72c5..001948d 100644
--- a/tests/Settings.json
+++ b/tests/Settings.json
@@ -1,5 +1,6 @@
{
"debug": true,
+ "debug_json": true,
"production": false,
"arr": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
"place": {
diff --git a/tests/async_builder.rs b/tests/async_builder.rs
new file mode 100644
index 0000000..5d7d6ba
--- /dev/null
+++ b/tests/async_builder.rs
@@ -0,0 +1,153 @@
+use async_trait::async_trait;
+use config::*;
+use std::{env, fs, path, str::FromStr};
+use tokio::{fs::File, io::AsyncReadExt};
+
+#[derive(Debug)]
+struct AsyncFile {
+ path: String,
+ format: FileFormat,
+}
+
+/// This is a test only implementation to be used in tests
+impl AsyncFile {
+ pub fn new(path: String, format: FileFormat) -> Self {
+ AsyncFile { path, format }
+ }
+}
+
+#[async_trait]
+impl AsyncSource for AsyncFile {
+ async fn collect(&self) -> Result<std::collections::HashMap<String, Value>, ConfigError> {
+ let mut path = env::current_dir().unwrap();
+ let local = path::PathBuf::from_str(&self.path).unwrap();
+
+ path.extend(local.into_iter());
+
+ let path = match fs::canonicalize(path) {
+ Ok(path) => path,
+ Err(e) => return Err(ConfigError::Foreign(Box::new(e))),
+ };
+
+ let text = match File::open(path).await {
+ Ok(mut file) => {
+ let mut buffer = String::default();
+ match file.read_to_string(&mut buffer).await {
+ Ok(_read) => buffer,
+ Err(e) => return Err(ConfigError::Foreign(Box::new(e))),
+ }
+ }
+ Err(e) => return Err(ConfigError::Foreign(Box::new(e))),
+ };
+
+ self.format
+ .parse(Some(&self.path), &text)
+ .map_err(|e| ConfigError::Foreign(e))
+ }
+}
+
+#[tokio::test]
+async fn test_single_async_file_source() {
+ let config = Config::builder()
+ .add_async_source(AsyncFile::new(
+ "tests/Settings.json".to_owned(),
+ FileFormat::Json,
+ ))
+ .build()
+ .await
+ .unwrap();
+
+ assert_eq!(true, config.get::<bool>("debug").unwrap());
+}
+
+#[tokio::test]
+async fn test_two_async_file_sources() {
+ let config = Config::builder()
+ .add_async_source(AsyncFile::new(
+ "tests/Settings.json".to_owned(),
+ FileFormat::Json,
+ ))
+ .add_async_source(AsyncFile::new(
+ "tests/Settings.toml".to_owned(),
+ FileFormat::Toml,
+ ))
+ .build()
+ .await
+ .unwrap();
+
+ assert_eq!("Torre di Pisa", config.get::<String>("place.name").unwrap());
+ assert_eq!(true, config.get::<bool>("debug_json").unwrap());
+ assert_eq!(1, config.get::<i32>("place.number").unwrap());
+}
+
+#[tokio::test]
+async fn test_sync_to_async_file_sources() {
+ let config = Config::builder()
+ .add_source(config::File::new("tests/Settings", FileFormat::Json))
+ .add_async_source(AsyncFile::new(
+ "tests/Settings.toml".to_owned(),
+ FileFormat::Toml,
+ ))
+ .build()
+ .await
+ .unwrap();
+
+ assert_eq!("Torre di Pisa", config.get::<String>("place.name").unwrap());
+ assert_eq!(1, config.get::<i32>("place.number").unwrap());
+}
+
+#[tokio::test]
+async fn test_async_to_sync_file_sources() {
+ let config = Config::builder()
+ .add_async_source(AsyncFile::new(
+ "tests/Settings.toml".to_owned(),
+ FileFormat::Toml,
+ ))
+ .add_source(config::File::new("tests/Settings", FileFormat::Json))
+ .build()
+ .await
+ .unwrap();
+
+ assert_eq!("Torre di Pisa", config.get::<String>("place.name").unwrap());
+ assert_eq!(1, config.get::<i32>("place.number").unwrap());
+}
+
+#[tokio::test]
+async fn test_async_file_sources_with_defaults() {
+ let config = Config::builder()
+ .set_default("place.name", "Tower of London")
+ .unwrap()
+ .set_default("place.sky", "blue")
+ .unwrap()
+ .add_async_source(AsyncFile::new(
+ "tests/Settings.toml".to_owned(),
+ FileFormat::Toml,
+ ))
+ .build()
+ .await
+ .unwrap();
+
+ assert_eq!("Torre di Pisa", config.get::<String>("place.name").unwrap());
+ assert_eq!("blue", config.get::<String>("place.sky").unwrap());
+ assert_eq!(1, config.get::<i32>("place.number").unwrap());
+}
+
+#[tokio::test]
+async fn test_async_file_sources_with_overrides() {
+ let config = Config::builder()
+ .set_override("place.name", "Tower of London")
+ .unwrap()
+ .add_async_source(AsyncFile::new(
+ "tests/Settings.toml".to_owned(),
+ FileFormat::Toml,
+ ))
+ .build()
+ .await
+ .unwrap();
+
+ assert_eq!(
+ "Tower of London",
+ config.get::<String>("place.name").unwrap()
+ );
+ assert_eq!(1, config.get::<i32>("place.number").unwrap());
+}