From 2757010d6df1b45f50bad4ccda9c9900a247b8e6 Mon Sep 17 00:00:00 2001 From: Sam Valladares Date: Thu, 18 Jun 2026 20:29:02 -0500 Subject: [PATCH] Make fastembed smoke tests tolerate unavailable model --- crates/vestige-core/src/embedder/fastembed.rs | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/crates/vestige-core/src/embedder/fastembed.rs b/crates/vestige-core/src/embedder/fastembed.rs index a6ac120..a4b079e 100644 --- a/crates/vestige-core/src/embedder/fastembed.rs +++ b/crates/vestige-core/src/embedder/fastembed.rs @@ -115,6 +115,14 @@ impl EmbedderSend for FastembedEmbedder { mod tests { use super::*; + #[cfg(feature = "embeddings")] + fn is_model_unavailable(err: &EmbedderError) -> bool { + let msg = err.to_string(); + msg.contains("Failed to retrieve") + || msg.contains("model files can be downloaded") + || msg.contains("Failed to initialize nomic-ai/nomic-embed-text-v1.5") + } + #[test] fn embedder_reports_correct_name() { let e = FastembedEmbedder::new(); @@ -162,7 +170,14 @@ mod tests { fn embedder_embed_smoke() { let e = FastembedEmbedder::new(); let rt = tokio::runtime::Runtime::new().unwrap(); - let vec = rt.block_on(e.embed("hello world")).expect("embed"); + let vec = match rt.block_on(e.embed("hello world")) { + Ok(vec) => vec, + Err(err) if is_model_unavailable(&err) => { + eprintln!("skipping fastembed smoke; model unavailable: {err}"); + return; + } + Err(err) => panic!("embed: {err}"), + }; assert_eq!(vec.len(), 256); } @@ -172,9 +187,30 @@ mod tests { let e = FastembedEmbedder::new(); let rt = tokio::runtime::Runtime::new().unwrap(); let texts = ["alpha beta", "gamma delta"]; - let batch = rt.block_on(e.embed_batch(texts.as_ref())).expect("batch"); - let seq_a = rt.block_on(e.embed(texts[0])).expect("seq a"); - let seq_b = rt.block_on(e.embed(texts[1])).expect("seq b"); + let batch = match rt.block_on(e.embed_batch(texts.as_ref())) { + Ok(batch) => batch, + Err(err) if is_model_unavailable(&err) => { + eprintln!("skipping fastembed batch smoke; model unavailable: {err}"); + return; + } + Err(err) => panic!("batch: {err}"), + }; + let seq_a = match rt.block_on(e.embed(texts[0])) { + Ok(vec) => vec, + Err(err) if is_model_unavailable(&err) => { + eprintln!("skipping fastembed sequential smoke; model unavailable: {err}"); + return; + } + Err(err) => panic!("seq a: {err}"), + }; + let seq_b = match rt.block_on(e.embed(texts[1])) { + Ok(vec) => vec, + Err(err) if is_model_unavailable(&err) => { + eprintln!("skipping fastembed sequential smoke; model unavailable: {err}"); + return; + } + Err(err) => panic!("seq b: {err}"), + }; assert_eq!(batch[0], seq_a); assert_eq!(batch[1], seq_b); }