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(_))));
+ }
+}