matrix-notify 0.4.2

A command line tool for sending messages to matrix chatrooms.
Documentation
use crate::config::Config;

use super::ApiError;

pub async fn verify_token(
    token: &str,
    config: &Config,
    client: &reqwest::Client,
) -> Result<String, ApiError> {
    let profile_url = config.get_profile_url();

    let profile_url_clone = profile_url.clone();

    let response = client
        .get(profile_url)
        .bearer_auth(token)
        .send()
        .await
        .map_err(|err| ApiError::HttpError {
            source: err,
            url: profile_url_clone,
        })?;

    if !response.status().is_success() {
        let status = response.status();
        let text = response.text().await.unwrap_or_default();
        return Err(ApiError::MatrixApiError {
            status_code: status,
            error_message: text,
        });
    }

    Ok(token.to_owned())
}

#[cfg(test)]
mod tests {
    use fake::{
        faker::internet::en::{Password, Username},
        Fake,
    };

    use crate::config::Config;

    use super::verify_token;

    #[tokio::test]
    async fn test_verify_token() {
        let mut mock_server = mockito::Server::new();

        let base_url = format!("http://{}", mock_server.host_with_port());

        let config = Config {
            base_url: base_url.clone(),
            local_username: Username().fake(),
            full_username: Username().fake(),
            password: None,
            token: Some(Password(16..24).fake()),
        };

        let full_profile_url = config.get_profile_url();
        let profile_url = full_profile_url
            .strip_prefix(base_url.as_str())
            .expect("Base URL missing from profile url");
        let profile_response_body = format!(
            r#"
{{
    "displayname": "{}",
    "avatar_url": null
}}
"#,
            config.local_username
        );

        let mock_endpoint = mock_server
            .mock("GET", profile_url)
            .with_status(200)
            .with_body(profile_response_body.as_str())
            .create();

        let client = reqwest::Client::new();

        let func_result =
            verify_token(config.token.clone().unwrap().as_str(), &config, &client).await;

        mock_endpoint.assert();

        assert!(func_result.is_ok(), "{:?}", func_result);
        assert_eq!(func_result.unwrap(), config.token.unwrap().as_str());
    }
}