This is an automated email from the ASF dual-hosted git repository.

maciej pushed a commit to branch connectors-mcp-token-file
in repository https://gitbox.apache.org/repos/asf/iggy.git


The following commit(s) were added to refs/heads/connectors-mcp-token-file by 
this push:
     new 7bdbdd69d add tests
7bdbdd69d is described below

commit 7bdbdd69d3c05c693d42b477a130911a71e62b8b
Author: Maciej Modzelewski <[email protected]>
AuthorDate: Thu Jan 15 12:24:00 2026 +0100

    add tests
---
 Cargo.lock                            |   6 +-
 DEPENDENCIES.md                       |   4 +-
 core/ai/mcp/Cargo.toml                |   5 +-
 core/ai/mcp/src/stream.rs             | 104 ++++++++++++++++++++++++++++++++++
 core/connectors/runtime/Cargo.toml    |   5 +-
 core/connectors/runtime/src/stream.rs | 104 ++++++++++++++++++++++++++++++++++
 6 files changed, 222 insertions(+), 6 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index cb266009f..c333aaabe 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4584,7 +4584,7 @@ dependencies = [
 
 [[package]]
 name = "iggy-connectors"
-version = "0.2.1-edge.1"
+version = "0.2.1-edge.2"
 dependencies = [
  "async-trait",
  "axum",
@@ -4614,6 +4614,7 @@ dependencies = [
  "serde_with",
  "serde_yaml_ng",
  "strum 0.27.2",
+ "tempfile",
  "thiserror 2.0.17",
  "tokio",
  "toml 0.9.10+spec-1.1.0",
@@ -4624,7 +4625,7 @@ dependencies = [
 
 [[package]]
 name = "iggy-mcp"
-version = "0.2.1-edge.1"
+version = "0.2.1-edge.2"
 dependencies = [
  "axum",
  "axum-server",
@@ -4638,6 +4639,7 @@ dependencies = [
  "serde",
  "serde_json",
  "strum 0.27.2",
+ "tempfile",
  "thiserror 2.0.17",
  "tokio",
  "tower-http",
diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md
index ac097d204..2da51928b 100644
--- a/DEPENDENCIES.md
+++ b/DEPENDENCIES.md
@@ -396,8 +396,8 @@ iggy: 0.8.1-edge.3, "Apache-2.0",
 iggy-bench: 0.3.1-edge.1, "Apache-2.0",
 iggy-bench-dashboard-server: 0.5.1-edge.1, "Apache-2.0",
 iggy-cli: 0.10.1-edge.1, "Apache-2.0",
-iggy-connectors: 0.2.1-edge.1, "Apache-2.0",
-iggy-mcp: 0.2.1-edge.1, "Apache-2.0",
+iggy-connectors: 0.2.1-edge.2, "Apache-2.0",
+iggy-mcp: 0.2.1-edge.2, "Apache-2.0",
 iggy_binary_protocol: 0.8.1-edge.1, "Apache-2.0",
 iggy_common: 0.8.1-edge.1, "Apache-2.0",
 iggy_connector_elasticsearch_sink: 0.1.0, "Apache-2.0",
diff --git a/core/ai/mcp/Cargo.toml b/core/ai/mcp/Cargo.toml
index 164d940f9..b5cb5b0e0 100644
--- a/core/ai/mcp/Cargo.toml
+++ b/core/ai/mcp/Cargo.toml
@@ -17,7 +17,7 @@
 
 [package]
 name = "iggy-mcp"
-version = "0.2.1-edge.1"
+version = "0.2.1-edge.2"
 description = "MCP Server for Iggy message streaming platform"
 edition = "2024"
 license = "Apache-2.0"
@@ -48,3 +48,6 @@ tokio = { workspace = true }
 tower-http = { workspace = true }
 tracing = { workspace = true }
 tracing-subscriber = { workspace = true }
+
+[dev-dependencies]
+tempfile = { workspace = true }
diff --git a/core/ai/mcp/src/stream.rs b/core/ai/mcp/src/stream.rs
index aa5a8c858..184c44ec8 100644
--- a/core/ai/mcp/src/stream.rs
+++ b/core/ai/mcp/src/stream.rs
@@ -120,3 +120,107 @@ pub async fn init(config: IggyConfig) -> 
Result<IggyClient, McpRuntimeError> {
     client.connect().await?;
     Ok(client)
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use std::io::Write;
+    use tempfile::NamedTempFile;
+
+    #[test]
+    fn test_expand_home_with_tilde_prefix() {
+        let path = "~/some/path";
+        let result = expand_home(path);
+
+        if let Some(home) = dirs::home_dir() {
+            assert_eq!(result, home.join("some/path"));
+        } else {
+            assert_eq!(result, PathBuf::from(path));
+        }
+    }
+
+    #[test]
+    fn test_expand_home_with_only_tilde() {
+        let path = "~";
+        let result = expand_home(path);
+
+        if let Some(home) = dirs::home_dir() {
+            assert_eq!(result, home);
+        } else {
+            assert_eq!(result, PathBuf::from(path));
+        }
+    }
+
+    #[test]
+    fn test_expand_home_without_tilde() {
+        let path = "/absolute/path";
+        let result = expand_home(path);
+        assert_eq!(result, PathBuf::from("/absolute/path"));
+    }
+
+    #[test]
+    fn test_expand_home_relative_path() {
+        let path = "relative/path";
+        let result = expand_home(path);
+        assert_eq!(result, PathBuf::from("relative/path"));
+    }
+
+    #[test]
+    fn test_resolve_token_direct_value() {
+        let token = "my-secret-token";
+        let result = resolve_token(token).unwrap();
+        assert_eq!(result, "my-secret-token");
+    }
+
+    #[test]
+    fn test_resolve_token_from_file() {
+        let mut temp_file = NamedTempFile::new().unwrap();
+        writeln!(temp_file, "token-from-file").unwrap();
+
+        let token = format!("file:{}", temp_file.path().display());
+        let result = resolve_token(&token).unwrap();
+        assert_eq!(result, "token-from-file");
+    }
+
+    #[test]
+    fn test_resolve_token_from_file_trims_whitespace() {
+        let mut temp_file = NamedTempFile::new().unwrap();
+        writeln!(temp_file, "  token-with-spaces  \n\n").unwrap();
+
+        let token = format!("file:{}", temp_file.path().display());
+        let result = resolve_token(&token).unwrap();
+        assert_eq!(result, "token-with-spaces");
+    }
+
+    #[test]
+    fn test_resolve_token_file_not_found() {
+        let token = "file:/nonexistent/path/to/token.txt";
+        let result = resolve_token(token);
+
+        assert!(result.is_err());
+        assert!(matches!(result, Err(McpRuntimeError::TokenFileNotFound(_))));
+    }
+
+    #[test]
+    fn test_resolve_token_empty_file() {
+        let temp_file = NamedTempFile::new().unwrap();
+
+        let token = format!("file:{}", temp_file.path().display());
+        let result = resolve_token(&token);
+
+        assert!(result.is_err());
+        assert!(matches!(result, Err(McpRuntimeError::TokenFileEmpty(_))));
+    }
+
+    #[test]
+    fn test_resolve_token_file_with_only_whitespace() {
+        let mut temp_file = NamedTempFile::new().unwrap();
+        writeln!(temp_file, "   \n\t\n   ").unwrap();
+
+        let token = format!("file:{}", temp_file.path().display());
+        let result = resolve_token(&token);
+
+        assert!(result.is_err());
+        assert!(matches!(result, Err(McpRuntimeError::TokenFileEmpty(_))));
+    }
+}
diff --git a/core/connectors/runtime/Cargo.toml 
b/core/connectors/runtime/Cargo.toml
index 28cbf24c1..2f2d18971 100644
--- a/core/connectors/runtime/Cargo.toml
+++ b/core/connectors/runtime/Cargo.toml
@@ -17,7 +17,7 @@
 
 [package]
 name = "iggy-connectors"
-version = "0.2.1-edge.1"
+version = "0.2.1-edge.2"
 description = "Connectors runtime for Iggy message streaming platform"
 edition = "2024"
 license = "Apache-2.0"
@@ -63,3 +63,6 @@ toml = { workspace = true }
 tower-http = { workspace = true }
 tracing = { workspace = true }
 tracing-subscriber = { workspace = true }
+
+[dev-dependencies]
+tempfile = { workspace = true }
diff --git a/core/connectors/runtime/src/stream.rs 
b/core/connectors/runtime/src/stream.rs
index e8d1b20d5..c2732d597 100644
--- a/core/connectors/runtime/src/stream.rs
+++ b/core/connectors/runtime/src/stream.rs
@@ -138,3 +138,107 @@ async fn create_client(
     client.connect().await?;
     Ok(client)
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use std::io::Write;
+    use tempfile::NamedTempFile;
+
+    #[test]
+    fn test_expand_home_with_tilde_prefix() {
+        let path = "~/some/path";
+        let result = expand_home(path);
+
+        if let Some(home) = dirs::home_dir() {
+            assert_eq!(result, home.join("some/path"));
+        } else {
+            assert_eq!(result, PathBuf::from(path));
+        }
+    }
+
+    #[test]
+    fn test_expand_home_with_only_tilde() {
+        let path = "~";
+        let result = expand_home(path);
+
+        if let Some(home) = dirs::home_dir() {
+            assert_eq!(result, home);
+        } else {
+            assert_eq!(result, PathBuf::from(path));
+        }
+    }
+
+    #[test]
+    fn test_expand_home_without_tilde() {
+        let path = "/absolute/path";
+        let result = expand_home(path);
+        assert_eq!(result, PathBuf::from("/absolute/path"));
+    }
+
+    #[test]
+    fn test_expand_home_relative_path() {
+        let path = "relative/path";
+        let result = expand_home(path);
+        assert_eq!(result, PathBuf::from("relative/path"));
+    }
+
+    #[test]
+    fn test_resolve_token_direct_value() {
+        let token = "my-secret-token";
+        let result = resolve_token(token).unwrap();
+        assert_eq!(result, "my-secret-token");
+    }
+
+    #[test]
+    fn test_resolve_token_from_file() {
+        let mut temp_file = NamedTempFile::new().unwrap();
+        writeln!(temp_file, "token-from-file").unwrap();
+
+        let token = format!("file:{}", temp_file.path().display());
+        let result = resolve_token(&token).unwrap();
+        assert_eq!(result, "token-from-file");
+    }
+
+    #[test]
+    fn test_resolve_token_from_file_trims_whitespace() {
+        let mut temp_file = NamedTempFile::new().unwrap();
+        writeln!(temp_file, "  token-with-spaces  \n\n").unwrap();
+
+        let token = format!("file:{}", temp_file.path().display());
+        let result = resolve_token(&token).unwrap();
+        assert_eq!(result, "token-with-spaces");
+    }
+
+    #[test]
+    fn test_resolve_token_file_not_found() {
+        let token = "file:/nonexistent/path/to/token.txt";
+        let result = resolve_token(token);
+
+        assert!(result.is_err());
+        assert!(matches!(result, Err(RuntimeError::TokenFileNotFound(_))));
+    }
+
+    #[test]
+    fn test_resolve_token_empty_file() {
+        let temp_file = NamedTempFile::new().unwrap();
+
+        let token = format!("file:{}", temp_file.path().display());
+        let result = resolve_token(&token);
+
+        assert!(result.is_err());
+        assert!(matches!(result, Err(RuntimeError::TokenFileEmpty(_))));
+    }
+
+    #[test]
+    fn test_resolve_token_file_with_only_whitespace() {
+        let mut temp_file = NamedTempFile::new().unwrap();
+        writeln!(temp_file, "   \n\t\n   ").unwrap();
+
+        let token = format!("file:{}", temp_file.path().display());
+        let result = resolve_token(&token);
+
+        assert!(result.is_err());
+        assert!(matches!(result, Err(RuntimeError::TokenFileEmpty(_))));
+    }
+}

Reply via email to