gbiz-info-api 0.2.0

gBizINFO REST API (v2) を Rust から利用するためのクライアントライブラリ
Documentation
//! 実 API に対する統合テスト。
//!
//! `.env` または環境変数 `API_TOKEN` に gBizINFO の API トークンを設定して実行する。
//! 未設定の場合は各テストをスキップする。

use gbiz_info_api::{GbizInfoClient, HojinSearchQuery, UpdateInfoQuery};

/// トヨタ自動車株式会社の法人番号
const TOYOTA: &str = "1180301018771";

fn client() -> Option<GbizInfoClient> {
    dotenvy::dotenv().ok();
    match std::env::var("API_TOKEN") {
        Ok(token) if !token.is_empty() => Some(GbizInfoClient::new(token)),
        _ => {
            eprintln!("API_TOKEN が未設定のためスキップします");
            None
        }
    }
}

#[tokio::test]
async fn search_by_name() {
    let Some(client) = client() else { return };
    let query = HojinSearchQuery::new().name("トヨタ自動車").limit(5);
    let res = client.search(&query).await.expect("search 失敗");
    let infos = res.into_hojin_infos();
    assert!(!infos.is_empty());
    assert!(infos.iter().all(|i| i.corporate_number.is_some()));
}

#[tokio::test]
async fn hojin_basic_info() {
    let Some(client) = client() else { return };
    let res = client.hojin(TOYOTA).await.expect("hojin 失敗");
    let infos = res.into_hojin_infos();
    assert_eq!(infos.len(), 1);
    assert_eq!(infos[0].name.as_deref(), Some("トヨタ自動車株式会社"));
    // メタデータ取得フラグ付き
    let res = client
        .hojin(TOYOTA)
        .metadata_flg(true)
        .await
        .expect("hojin(metadata_flg) 失敗");
    let infos = res.into_hojin_infos();
    assert!(infos[0].meta_data.is_some());
}

#[tokio::test]
async fn finance_by_corporate_number() {
    let Some(client) = client() else { return };
    let res = client.finance(TOYOTA).await.expect("finance 失敗");
    let infos = res.into_hojin_infos();
    assert_eq!(infos.len(), 1);
    assert!(infos[0].finance.is_some());
}

#[tokio::test]
async fn update_info_with_paging() {
    let Some(client) = client() else { return };
    let query = UpdateInfoQuery::new("20260701", "20260702");
    let res = client.update_info(&query).await.expect("update_info 失敗");
    assert!(res.total_count.is_some());
    assert!(res.page_number.is_some());
    assert!(!res.into_hojin_infos().is_empty());
}

#[tokio::test]
async fn not_found_returns_status_error() {
    let Some(client) = client() else { return };
    let err = client
        .hojin("0000000000000")
        .await
        .expect_err("存在しない法人番号でエラーにならなかった");
    assert!(err.is_not_found(), "404 以外のエラー: {err}");
}