Documentation
use std::fmt::Display;

use serde_json::json;

use super::*;

pub struct MockAPI;

#[derive(Debug, thiserror::Error)]
pub struct MockError;

impl Display for MockError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "mock error")
    }
}

#[async_trait]
impl API for MockAPI {
    type Error = MockError;

    async fn method<T>(&self, _method: Method) -> Result<T, Self::Error>
    where for<'de>
        T: serde::Deserialize<'de>
    {
        Ok(
            serde_json::from_value(json!(
                [{
                    "id": 5,
                    "first_name": "durov"
                }]
            )
        ).unwrap())
    }
}

#[tokio::test]
async fn mock_api() {
    let api = MockAPI;

    assert_eq!(
        api.users_get().user_id(1).user_ids(vec![4,5]).send().await.unwrap(),
        vec![User {id: 5, first_name: "durov".to_string(), bdate: None}]
    );
}