chaotic_semantic_memory 0.3.8

AI memory systems with hyperdimensional vectors and chaotic reservoirs
Documentation
#![allow(clippy::unwrap_used, clippy::expect_used, clippy::panic)]
#![allow(clippy::significant_drop_tightening)]

#[cfg(any(feature = "embed-openai", feature = "embed-voyage"))]
mod tests {
    use chaotic_semantic_memory::embedding::EmbeddingProvider;
    #[cfg(feature = "embed-openai")]
    use chaotic_semantic_memory::embedding::OpenAiProvider;
    #[cfg(feature = "embed-voyage")]
    use chaotic_semantic_memory::embedding::VoyageProvider;
    use mockito::Server;
    use serde_json::json;

    #[cfg(feature = "embed-openai")]
    #[tokio::test]
    async fn test_openai_embed_mock() {
        let mut server = Server::new_async().await;
        let url = server.url();

        let mock = server
            .mock("POST", "/embeddings")
            .with_status(200)
            .with_header("content-type", "application/json")
            .with_body(
                json!({
                    "data": [
                        {
                            "embedding": [0.1, 0.2, 0.3]
                        }
                    ]
                })
                .to_string(),
            )
            .create_async()
            .await;

        let provider = OpenAiProvider::new("test-key".into())
            .unwrap()
            .with_base_url(url);

        let result = provider.embed("hello").await.unwrap();
        assert_eq!(result, vec![0.1, 0.2, 0.3]);
        mock.assert_async().await;
    }

    #[cfg(feature = "embed-openai")]
    #[tokio::test]
    async fn test_openai_embed_batch_mock() {
        let mut server = Server::new_async().await;
        let url = server.url();

        let mock = server
            .mock("POST", "/embeddings")
            .with_status(200)
            .with_header("content-type", "application/json")
            .with_body(
                json!({
                    "data": [
                        { "embedding": [0.1, 0.2] },
                        { "embedding": [0.3, 0.4] }
                    ]
                })
                .to_string(),
            )
            .create_async()
            .await;

        let provider = OpenAiProvider::new("test-key".into())
            .unwrap()
            .with_base_url(url);

        let result = provider.embed_batch(&["a", "b"]).await.unwrap();
        assert_eq!(result.len(), 2);
        assert_eq!(result[0], vec![0.1, 0.2]);
        assert_eq!(result[1], vec![0.3, 0.4]);
        mock.assert_async().await;
    }

    #[cfg(feature = "embed-voyage")]
    #[tokio::test]
    async fn test_voyage_embed_mock() {
        let mut server = Server::new_async().await;
        let url = server.url();

        let mock = server
            .mock("POST", "/embeddings")
            .with_status(200)
            .with_header("content-type", "application/json")
            .with_body(
                json!({
                    "data": [
                        {
                            "embedding": [0.5, 0.6]
                        }
                    ]
                })
                .to_string(),
            )
            .create_async()
            .await;

        let provider = VoyageProvider::new("test-key".into())
            .unwrap()
            .with_base_url(url);

        let result = provider.embed("hello").await.unwrap();
        assert_eq!(result, vec![0.5, 0.6]);
        mock.assert_async().await;
    }

    #[cfg(feature = "embed-voyage")]
    #[tokio::test]
    async fn test_voyage_embed_batch_mock() {
        let mut server = Server::new_async().await;
        let url = server.url();

        let mock = server
            .mock("POST", "/embeddings")
            .with_status(200)
            .with_header("content-type", "application/json")
            .with_body(
                json!({
                    "data": [
                        { "embedding": [0.7, 0.8] },
                        { "embedding": [0.9, 1.0] }
                    ]
                })
                .to_string(),
            )
            .create_async()
            .await;

        let provider = VoyageProvider::new("test-key".into())
            .unwrap()
            .with_base_url(url);

        let result = provider.embed_batch(&["x", "y"]).await.unwrap();
        assert_eq!(result.len(), 2);
        assert_eq!(result[0], vec![0.7, 0.8]);
        assert_eq!(result[1], vec![0.9, 1.0]);
        mock.assert_async().await;
    }

    #[cfg(feature = "embed-openai")]
    #[tokio::test]
    async fn test_remote_provider_error_handling() {
        let mut server = Server::new_async().await;
        let url = server.url();

        let _mock = server
            .mock("POST", "/embeddings")
            .with_status(401)
            .with_body("Unauthorized")
            .create_async()
            .await;

        let provider = OpenAiProvider::new("wrong-key".into())
            .unwrap()
            .with_base_url(url);

        let result = provider.embed("hello").await;
        assert!(result.is_err());
    }
}