acorn-lib 0.3.2

ACORN library
use super::*;
use crate::io::api::{EmptyField, Param};

fn project() -> Project {
    Project {
        code_id: 156286,
        site_ownership_code: "ORNL".to_string(),
        software_title: "ACORN".to_string(),
        developers: vec![ProjectPerson {
            orcid: "0000-0002-2057-9115".to_string(),
            first_name: "Jason".to_string(),
            last_name: "Wohlgemuth".to_string(),
            affiliations: vec!["Oak Ridge National Laboratory (ORNL)".to_string()],
            ..ProjectPerson::default()
        }],
        research_organizations: vec![ProjectOrganization {
            organization_name: "Oak Ridge National Laboratory (ORNL)".to_string(),
            doe: true,
            primary_award: None,
        }],
        ..Project::default()
    }
}
#[test]
fn test_organization_filter_matches_role() {
    let project = project();
    assert!(matches_organization(&project, Some("ORNL"), RemoteOrganizationRole::Research));
    assert!(!matches_organization(&project, Some("ANL"), RemoteOrganizationRole::Any));
}
#[test]
fn test_people_and_organizations_are_projected() {
    let projects = vec![project(), project()];
    assert_eq!(people(&projects).len(), 1);
    let all_organizations = organizations(&projects, RemoteOrganizationRole::Any, None);
    assert!(all_organizations
        .iter()
        .any(|organization| organization.aliases.iter().any(|alias| alias == "ORNL")));
    let filtered_organizations = organizations(&projects, RemoteOrganizationRole::Any, Some("ORNL"));
    assert_eq!(filtered_organizations.len(), 1);
    assert_eq!(
        filtered_organizations.first().map(|organization| organization.name.as_str()),
        Some("Oak Ridge National Laboratory (ORNL)")
    );
    assert_eq!(
        acronym("Oak Ridge National Laboratory (ORNL), Oak Ridge, TN (United States)"),
        Some("ORNL".to_string())
    );
}
#[test]
fn test_project_converts_to_research_activity() {
    let activity = ResearchActivity::from(project());
    assert_eq!(activity.title, "ACORN");
    assert_eq!(activity.meta.identifier, "osti-156286");
}
#[test]
fn test_request_url_normalizes_doi_and_orcid() {
    let doi = Options {
        query: "https://doi.org/10.11578/dc.20250604.1".to_string(),
        start: 40,
        ..Options::default()
    };
    let doi_query = Param::to_query_string::<EmptyField, EmptyField>(request_params(&doi).unwrap());
    assert!(doi_query.contains("identifiers=10.11578%2Fdc.20250604.1"));
    assert!(doi_query.contains("start=40"));
    let orcid = Options {
        query: "https://orcid.org/0000-0002-2057-9115".to_string(),
        view: SearchView::People,
        ..Options::default()
    };
    let orcid_query = Param::to_query_string::<EmptyField, EmptyField>(request_params(&orcid).unwrap());
    assert!(orcid_query.contains("orcid=0000-0002-2057-9115"));
}
#[test]
fn test_with_query_uses_organization_filter_for_organization_view() {
    let projects = Options::default().with_query("visualization");
    assert_eq!(projects.query, "visualization");
    assert_eq!(projects.organization, None);
    let organizations = Options {
        view: SearchView::Organizations,
        ..Options::default()
    }
    .with_query("ORNL");
    assert_eq!(organizations.query, "");
    assert_eq!(organizations.organization.as_deref(), Some("ORNL"));
}