Documentation
use std::sync::LazyLock;
use vn::TagField::*;
use vn::{TagCategory, TagId, Vndb};

const FANTASY: &str = "Medieval Fantasy";

static FANTASY_ID: LazyLock<TagId> = LazyLock::new(|| {
  let id = format!("{}{}", TagId::PREFIX, 994);
  TagId::new(&id).unwrap()
});

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

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

  let tag = results.pop_front().unwrap();
  let name = tag.name.as_deref().unwrap();
  let category = tag.category.as_ref().unwrap();

  assert_eq!(&tag.id, &*FANTASY_ID);
  assert!(name.eq_ignore_ascii_case(FANTASY));
  assert_eq!(category, &TagCategory::Content);
}

#[tokio::test]
async fn find_tag() {
  let tag = Vndb::new()
    .find_tag(&*FANTASY_ID)
    .fields([Name, Category])
    .send()
    .await
    .unwrap()
    .pop_front()
    .unwrap();

  assert_eq!(&tag.id, &*FANTASY_ID);
  assert_eq!(tag.name.as_deref(), Some(FANTASY));
  assert_eq!(tag.category, Some(TagCategory::Content));
}

#[tokio::test]
async fn search_tag() {
  let tag = Vndb::new()
    .search_tag(FANTASY.to_ascii_lowercase())
    .fields([Name, Category])
    .send()
    .await
    .unwrap()
    .pop_front()
    .unwrap();

  assert_eq!(&tag.id, &*FANTASY_ID);
  assert_eq!(tag.name.as_deref(), Some(FANTASY));
  assert_eq!(tag.category, Some(TagCategory::Content));
}