acorn-lib 0.3.2

ACORN library
use super::*;
use std::fs::write;
use tempfile::tempdir;

fn values(selectors: &ModelSelectors) -> Vec<String> {
    selectors.iter().map(|value| value.as_str().to_string()).collect()
}

#[tokio::test]
async fn test_model_selectors_resolve_merges_local_source_in_order() {
    let directory = tempdir().expect("temporary directory should be created");
    let path = directory.path().join("models.txt");
    write(&path, "second/model\nthird/model\n").expect("model fixture should be written");
    let selectors = ModelSelectors::from(vec!["first/model".to_string(), "second/model".to_string()]);
    let resolved = selectors
        .resolve(&Some(path.display().to_string()), true)
        .await
        .expect("local model list should resolve");
    assert_eq!(values(&resolved), ["first/model", "second/model", "second/model", "third/model"]);
}

#[tokio::test]
async fn test_model_selectors_resolve_none_preserves_collection() {
    let selectors = ModelSelectors::from(vec![" first/model ".to_string(), "second/model".to_string()]);
    let resolved = selectors.clone().resolve(&None, true).await.expect("absent source should resolve");
    assert_eq!(resolved, selectors);
}

#[tokio::test]
async fn test_model_selectors_resolve_propagates_parse_error_without_changing_input() {
    let directory = tempdir().expect("temporary directory should be created");
    let path = directory.path().join("models.yaml");
    write(&path, "models:\n  - missing required fields\n").expect("model fixture should be written");
    let selectors = ModelSelectors::from(vec!["first/model".to_string()]);
    assert!(selectors.clone().resolve(&Some(path.display().to_string()), true).await.is_err());
    assert_eq!(values(&selectors), ["first/model"]);
}

#[tokio::test]
async fn test_model_selectors_resolve_rejects_remote_source_offline() {
    let selectors = ModelSelectors::default();
    let result = selectors.resolve(&Some("https://example.com/models.txt".to_string()), true).await;
    assert!(result.is_err());
}