Documentation
use std::sync::LazyLock;
use vn::TraitField::*;
use vn::{TraitId, Vndb};

const AIRHEAD: &str = "Airhead";
const AIRHEAD_GROUP: &str = "Personality";

static AIRHEAD_ID: LazyLock<TraitId> = LazyLock::new(|| {
  let id = format!("{}{}", TraitId::PREFIX, 229);
  TraitId::new(&id).unwrap()
});

#[tokio::test]
async fn get_trait() {
  let vndb = Vndb::new();
  let filters = r#"["id", "=", "i229"]"#;
  let mut results = vndb
    .post()
    .r#trait()
    .filters(filters.try_into().unwrap())
    .fields([Name, GroupName])
    .results(5)
    .send()
    .await
    .unwrap()
    .results;

  assert_eq!(results.len(), 1);

  let r#trait = results.pop_front().unwrap();
  let name = r#trait.name.as_deref().unwrap();
  let group_name = r#trait.group_name.as_deref().unwrap();

  assert_eq!(&r#trait.id, &*AIRHEAD_ID);
  assert!(name.eq_ignore_ascii_case(AIRHEAD));
  assert!(group_name.eq_ignore_ascii_case(AIRHEAD_GROUP));
}

#[tokio::test]
async fn find_trait() {
  let r#trait = Vndb::new()
    .find_trait(&*AIRHEAD_ID)
    .fields([Name, GroupName])
    .send()
    .await
    .unwrap()
    .results
    .pop_front()
    .unwrap();

  assert_eq!(&r#trait.id, &*AIRHEAD_ID);
  assert_eq!(r#trait.name.as_deref(), Some(AIRHEAD));
  assert_eq!(r#trait.group_name.as_deref(), Some(AIRHEAD_GROUP));
}

#[tokio::test]
async fn search_trait() {
  let r#trait = Vndb::new()
    .search_trait(AIRHEAD.to_ascii_lowercase())
    .fields([Name, GroupName])
    .send()
    .await
    .unwrap()
    .results
    .pop_front()
    .unwrap();

  assert_eq!(&r#trait.id, &*AIRHEAD_ID);
  assert_eq!(r#trait.name.as_deref(), Some(AIRHEAD));
  assert_eq!(r#trait.group_name.as_deref(), Some(AIRHEAD_GROUP));
}