carapax 0.36.0

A Telegram Bot Framework
Documentation
use std::{error::Error, fmt};

use futures_util::future::{Ready, err, ok};

use crate::{
    core::HandlerInput,
    types::{Integer, Update},
};

use super::*;

#[derive(Debug)]
struct ErrorMock;

impl Error for ErrorMock {}

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

#[derive(Clone)]
struct PolicyMock;

impl AccessPolicy for PolicyMock {
    type Error = ErrorMock;
    type Future = Ready<Result<bool, Self::Error>>;

    fn is_granted(&self, input: HandlerInput) -> Self::Future {
        match input.update.get_user().map(|user| Integer::from(user.id)) {
            Some(1) => ok(true),
            Some(2) => ok(false),
            Some(_) => err(ErrorMock),
            None => err(ErrorMock),
        }
    }
}

#[tokio::test]
async fn access_predicate() {
    let policy = PolicyMock;
    let predicate = AccessPredicate::new(policy);

    let update_granted: Update = serde_json::from_value(serde_json::json!(
        {
            "update_id": 1,
            "message": {
                "message_id": 1111,
                "date": 0,
                "from": {"id": 1, "is_bot": false, "first_name": "test"},
                "chat": {"id": 1, "type": "private", "first_name": "test"},
                "text": "test",
            }
        }
    ))
    .unwrap();
    let input_granted = HandlerInput::from(update_granted);
    let result = predicate.handle(input_granted).await;
    assert!(result.unwrap());

    let update_forbidden: Update = serde_json::from_value(serde_json::json!(
        {
            "update_id": 1,
            "message": {
                "message_id": 1111,
                "date": 0,
                "from": {"id": 2, "is_bot": false, "first_name": "test"},
                "chat": {"id": 1, "type": "private", "first_name": "test"},
                "text": "test",
            }
        }
    ))
    .unwrap();
    let input_forbidden = HandlerInput::from(update_forbidden);
    let result = predicate.handle(input_forbidden).await;
    assert!(!result.unwrap());

    let update_error: Update = serde_json::from_value(serde_json::json!(
        {
            "update_id": 1,
            "message": {
                "message_id": 1111,
                "date": 0,
                "from": {"id": 3, "is_bot": false, "first_name": "test"},
                "chat": {"id": 1, "type": "private", "first_name": "test"},
                "text": "test",
            }
        }
    ))
    .unwrap();
    let input_error = HandlerInput::from(update_error);
    let result = predicate.handle(input_error).await;
    assert!(result.is_err());
}