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()
);
}
}