refluxer 0.2.0

Rust API wrapper for Fluxer
Documentation
mod common;
use common::setup;
use refluxer::http::endpoints::moderation::{CreateRole, ModifyRole};
use refluxer::model::permissions::Permissions;

#[tokio::test]
async fn test_role_crud() {
    let (http, guild_id) = setup();

    let role = http
        .create_guild_role(
            guild_id,
            &CreateRole::new("refluxer-test-role")
                .color(0xFF5500)
                .hoist(true)
                .permissions(Permissions::SEND_MESSAGES | Permissions::VIEW_CHANNEL),
        )
        .await
        .expect("create_guild_role failed");

    assert_eq!(role.name, "refluxer-test-role");
    assert_eq!(role.color, 0xFF5500);
    println!(
        "Created role: {} (id: {}, hoist: {})",
        role.name, role.id, role.hoist
    );

    let roles = http
        .get_guild_roles(guild_id)
        .await
        .expect("get_guild_roles failed");

    assert!(
        roles.iter().any(|r| r.id == role.id),
        "created role should be in the list"
    );

    let modified = http
        .modify_guild_role(
            guild_id,
            role.id,
            &ModifyRole::new()
                .name("refluxer-test-renamed")
                .color(0x00FF00),
        )
        .await
        .expect("modify_guild_role failed");

    assert_eq!(modified.name, "refluxer-test-renamed");
    assert_eq!(modified.color, 0x00FF00);

    http.delete_guild_role(guild_id, role.id)
        .await
        .expect("delete_guild_role failed");

    let roles_after = http
        .get_guild_roles(guild_id)
        .await
        .expect("get_guild_roles failed");

    assert!(
        !roles_after.iter().any(|r| r.id == role.id),
        "deleted role should not be in the list"
    );

    println!("Role CRUD tests passed");
}

#[tokio::test]
async fn test_add_remove_member_role() {
    let (http, guild_id) = setup();

    let me = http
        .get_current_user()
        .await
        .expect("get_current_user failed");

    let role = http
        .create_guild_role(guild_id, &CreateRole::new("refluxer-test-assign"))
        .await
        .expect("create_guild_role failed");

    match http.add_guild_member_role(guild_id, me.id, role.id).await {
        Ok(()) => {
            let member = http
                .get_guild_member(guild_id, me.id)
                .await
                .expect("get_guild_member failed");

            assert!(
                member.roles.contains(&role.id),
                "bot should have the assigned role"
            );

            http.remove_guild_member_role(guild_id, me.id, role.id)
                .await
                .expect("remove_guild_member_role failed");

            let member_after = http
                .get_guild_member(guild_id, me.id)
                .await
                .expect("get_guild_member failed");

            assert!(
                !member_after.roles.contains(&role.id),
                "bot should not have the role anymore"
            );

            println!("Member role assignment tests passed");
        }
        Err(refluxer::error::HttpError::Api { status: 403, .. }) => {
            println!("Bot lacks MANAGE_ROLES permission — skipping role assignment test");
        }
        Err(e) => panic!("unexpected error: {e}"),
    }

    http.delete_guild_role(guild_id, role.id)
        .await
        .expect("cleanup role failed");
}

#[tokio::test]
async fn test_guild_permissions_deserialized() {
    let (http, guild_id) = setup();

    let roles = http
        .get_guild_roles(guild_id)
        .await
        .expect("get_guild_roles failed");

    assert!(!roles.is_empty(), "guild should have at least one role");

    for role in &roles {
        println!(
            "Role: {} — permissions: {} (bits: {})",
            role.name,
            role.permissions,
            role.permissions.bits()
        );
    }
}