dco3 0.20.1

Async API wrapper for DRACOON in Rust.
Documentation
#[cfg(test)]
pub mod tests {
    use crate::{
        tests::dracoon::get_connected_client,
        user::UserAuthData,
        users::{
            CreateUserRequest, UpdateUserRequest, UserData, UserItem, UsersFilter, UsersSortBy,
        },
        ListAllParams, SortOrder, Users,
    };

    pub fn assert_user_item(user: &UserItem) {
        assert_eq!(user.id, 1);
        assert_eq!(user.user_name, "string");
        assert_eq!(user.first_name, "string");
        assert_eq!(user.last_name, "string");
        assert_eq!(user.email.as_ref().unwrap(), "string");
        assert!(!user.is_locked);
        assert!(user.is_encryption_enabled.unwrap());
        assert_eq!(user.avatar_uuid, "string");
    }

    fn assert_user_data(user: &UserData) {
        assert_eq!(user.id, 1);
        assert_eq!(user.user_name, "string");
        assert_eq!(user.first_name, "string");
        assert_eq!(user.last_name, "string");
        assert_eq!(user.email.as_ref().unwrap(), "string");
        assert!(!user.is_locked);
        assert!(user.is_encryption_enabled.unwrap());
        assert_eq!(user.avatar_uuid, "string");
        assert_eq!(user.auth_data.method, "basic");
        assert_eq!(user.home_room_id.unwrap(), 2);
        assert!(user.is_mfa_enabled.unwrap());
        assert!(user.is_mfa_enforced.unwrap());
    }

    #[tokio::test]
    async fn test_get_users() {
        let (client, mut mock_server) = get_connected_client().await;

        let users_res = include_str!("./responses/users/users_ok.json");

        let users_mock = mock_server
            .mock("GET", "/api/v4/users?offset=0")
            .with_status(200)
            .with_body(users_res)
            .create();

        let users = client.users().get_users(None, None, None).await.unwrap();

        users_mock.assert();
        assert_eq!(users.range.offset, 0);
        assert_eq!(users.range.limit, 0);
        assert_eq!(users.range.total, 1);
        let user = users.items.first().unwrap();
        assert_user_item(user);
    }

    #[tokio::test]
    async fn test_get_users_with_limit() {
        let (client, mut mock_server) = get_connected_client().await;

        let users_res = include_str!("./responses/users/users_ok.json");

        let users_mock = mock_server
            .mock("GET", "/api/v4/users?limit=100&offset=0")
            .with_status(200)
            .with_body(users_res)
            .create();

        let params = ListAllParams::builder().with_limit(100).build();

        let users = client
            .users()
            .get_users(Some(params), None, None)
            .await
            .unwrap();

        users_mock.assert();
        assert_eq!(users.range.offset, 0);
        assert_eq!(users.range.limit, 0);
        assert_eq!(users.range.total, 1);
        let user = users.items.first().unwrap();
        assert_user_item(user);
    }

    #[tokio::test]
    async fn test_get_users_with_offset() {
        let (client, mut mock_server) = get_connected_client().await;

        let users_res = include_str!("./responses/users/users_ok.json");

        let users_mock = mock_server
            .mock("GET", "/api/v4/users?offset=500")
            .with_status(200)
            .with_body(users_res)
            .create();

        let params = ListAllParams::builder().with_offset(500).build();

        let users = client
            .users()
            .get_users(Some(params), None, None)
            .await
            .unwrap();

        users_mock.assert();
        assert_eq!(users.range.offset, 0);
        assert_eq!(users.range.limit, 0);
        assert_eq!(users.range.total, 1);
        let user = users.items.first().unwrap();
        assert_user_item(user);
    }

    #[tokio::test]
    async fn test_get_users_with_sort() {
        let (client, mut mock_server) = get_connected_client().await;

        let users_res = include_str!("./responses/users/users_ok.json");

        let users_mock = mock_server
            .mock("GET", "/api/v4/users?offset=0&sort=createdAt%3Aasc")
            .with_status(200)
            .with_body(users_res)
            .create();

        let params = ListAllParams::builder()
            .with_sort(UsersSortBy::CreatedAt(SortOrder::Asc))
            .build();

        let users = client
            .users()
            .get_users(Some(params), None, None)
            .await
            .unwrap();

        users_mock.assert();
        assert_eq!(users.range.offset, 0);
        assert_eq!(users.range.limit, 0);
        assert_eq!(users.range.total, 1);
        let user = users.items.first().unwrap();
        assert_user_item(user);
    }

    #[tokio::test]
    async fn test_get_users_with_filter() {
        let (client, mut mock_server) = get_connected_client().await;

        let users_res = include_str!("./responses/users/users_ok.json");

        let users_mock = mock_server
            .mock("GET", "/api/v4/users?offset=0&filter=email%3Acn%3Atest")
            .with_status(200)
            .with_body(users_res)
            .create();

        let params = ListAllParams::builder()
            .with_filter(UsersFilter::email_contains("test"))
            .build();

        let users = client
            .users()
            .get_users(Some(params), None, None)
            .await
            .unwrap();

        users_mock.assert();
        assert_eq!(users.range.offset, 0);
        assert_eq!(users.range.limit, 0);
        assert_eq!(users.range.total, 1);
        let user = users.items.first().unwrap();
        assert_user_item(user);
    }

    #[tokio::test]
    async fn test_get_users_with_roles() {
        let (client, mut mock_server) = get_connected_client().await;

        let users_res = include_str!("./responses/users/users_ok.json");

        let users_mock = mock_server
            .mock("GET", "/api/v4/users?offset=0&include_roles=true")
            .with_status(200)
            .with_body(users_res)
            .create();

        let users = client
            .users()
            .get_users(None, Some(true), None)
            .await
            .unwrap();

        users_mock.assert();
        assert_eq!(users.range.offset, 0);
        assert_eq!(users.range.limit, 0);
        assert_eq!(users.range.total, 1);
        let user = users.items.first().unwrap();
        assert_user_item(user);
    }

    #[tokio::test]
    async fn test_get_users_with_attributes() {
        let (client, mut mock_server) = get_connected_client().await;

        let users_res = include_str!("./responses/users/users_ok.json");

        let users_mock = mock_server
            .mock("GET", "/api/v4/users?offset=0&include_attributes=true")
            .with_status(200)
            .with_body(users_res)
            .create();

        let users = client
            .users()
            .get_users(None, None, Some(true))
            .await
            .unwrap();

        users_mock.assert();
        assert_eq!(users.range.offset, 0);
        assert_eq!(users.range.limit, 0);
        assert_eq!(users.range.total, 1);
        let user = users.items.first().unwrap();
        assert_user_item(user);
    }

    #[tokio::test]
    async fn test_create_user() {
        let (client, mut mock_server) = get_connected_client().await;

        let user_res = include_str!("./responses/users/user_ok.json");

        let user_mock = mock_server
            .mock("POST", "/api/v4/users")
            .with_status(201)
            .with_body(user_res)
            .create();

        let auth = UserAuthData::new_basic(None, None);
        let user_req = CreateUserRequest::builder("test", "test")
            .with_email("test@localhost")
            .with_auth_data(auth)
            .build();

        let user = client.users().create_user(user_req).await.unwrap();

        user_mock.assert();

        assert_user_data(&user);
    }

    #[tokio::test]
    async fn test_get_user() {
        let (client, mut mock_server) = get_connected_client().await;

        let user_res = include_str!("./responses/users/user_ok.json");

        let user_mock = mock_server
            .mock("GET", "/api/v4/users/123")
            .with_status(200)
            .with_body(user_res)
            .create();

        let user = client.users().get_user(123, None).await.unwrap();

        user_mock.assert();

        assert_user_data(&user);
    }

    #[tokio::test]
    async fn test_update_user() {
        let (client, mut mock_server) = get_connected_client().await;
        let user_res = include_str!("./responses/users/user_ok.json");

        let user_mock = mock_server
            .mock("PUT", "/api/v4/users/123")
            .with_status(200)
            .with_body(user_res)
            .create();

        let user_req = UpdateUserRequest::builder()
            .with_email("foo@localhost")
            .build();

        let user = client.users().update_user(123, user_req).await.unwrap();

        user_mock.assert();

        assert_user_data(&user);
    }

    #[tokio::test]
    async fn test_delete_user() {
        let (client, mut mock_server) = get_connected_client().await;
        let user_res = include_str!("./responses/users/user_ok.json");

        let user_mock = mock_server
            .mock("DELETE", "/api/v4/users/123")
            .with_status(200)
            .with_body(user_res)
            .create();

        let res = client.users().delete_user(123).await;

        assert!(res.is_ok());

        user_mock.assert();
    }
}