diff --git a/crates/core/database/fixtures/server_with_roles.json b/crates/core/database/fixtures/server_with_roles.json index 01ec436b..68e6045b 100644 --- a/crates/core/database/fixtures/server_with_roles.json +++ b/crates/core/database/fixtures/server_with_roles.json @@ -52,7 +52,7 @@ "a": 545270208, "d": 0 }, - "rank": 3 + "rank": 1 }, "__ID:6__": { "name": "Owner", @@ -61,6 +61,22 @@ "d": 0 }, "rank": 0 + }, + "__ID:7__": { + "name": "Lower Rank 1", + "permissions": { + "a": 0, + "d": 0 + }, + "rank": 2 + }, + "__ID:8__": { + "name": "Lower Rank 2", + "permissions": { + "a": 0, + "d": 0 + }, + "rank": 2 } }, "default_permissions": 4000322560 diff --git a/crates/delta/fixtures/group_with_members.json b/crates/delta/fixtures/group_with_members.json new file mode 100644 index 00000000..a4544176 --- /dev/null +++ b/crates/delta/fixtures/group_with_members.json @@ -0,0 +1,28 @@ +[ + { + "_object_type": "User", + "_id": "__ID:0__", + "username": "Owner", + "discriminator": "0001" + }, + { + "_object_type": "User", + "_id": "__ID:1__", + "username": "Member", + "discriminator": "0001" + }, + { + "_object_type": "User", + "_id": "__ID:2__", + "username": "Member", + "discriminator": "0002" + }, + { + "_object_type": "Channel", + "_id": "__ID:3__", + "channel_type": "Group", + "name": "My Group", + "owner": "__ID:0__", + "recipients": ["__ID:0__", "__ID:1__"] + } +] diff --git a/crates/delta/fixtures/server_with_roles.json b/crates/delta/fixtures/server_with_roles.json new file mode 100644 index 00000000..8eb61601 --- /dev/null +++ b/crates/delta/fixtures/server_with_roles.json @@ -0,0 +1,111 @@ +[ + { + "_object_type": "User", + "_id": "__ID:0__", + "username": "Owner", + "discriminator": "0001" + }, + { + "_object_type": "User", + "_id": "__ID:1__", + "username": "Moderator", + "discriminator": "0001" + }, + { + "_object_type": "User", + "_id": "__ID:2__", + "username": "User", + "discriminator": "0001" + }, + { + "_object_type": "Channel", + "_id": "__ID:3__", + "channel_type": "TextChannel", + "name": "General", + "server": "__ID:4__", + "default_permissions": { + "a": 0, + "d": 1048576 + }, + "role_permissions": { + "__ID:5__": { + "a": 1048576, + "d": 0 + } + } + }, + { + "_object_type": "Server", + "_id": "__ID:4__", + "owner": "__ID:0__", + "name": "Server", + "channels": [ + "__ID:3__" + ], + "roles": { + "__ID:5__": { + "name": "Moderator", + "permissions": { + "a": 545270208, + "d": 0 + }, + "rank": 1 + }, + "__ID:6__": { + "name": "Owner", + "permissions": { + "a": 0, + "d": 0 + }, + "rank": 0 + }, + "__ID:7__": { + "name": "Lower Rank 1", + "permissions": { + "a": 0, + "d": 0 + }, + "rank": 2 + }, + "__ID:8__": { + "name": "Lower Rank 2", + "permissions": { + "a": 0, + "d": 0 + }, + "rank": 2 + } + }, + "default_permissions": 4000322560 + }, + { + "_object_type": "ServerMember", + "_id": { + "user": "__ID:0__", + "server": "__ID:4__" + }, + "roles": [ + "__ID:6__" + ], + "joined_at": 1698318340195 + }, + { + "_object_type": "ServerMember", + "_id": { + "user": "__ID:1__", + "server": "__ID:4__" + }, + "roles": [ + "__ID:5__" + ], + "joined_at": 1698318340195 + }, + { + "_object_type": "ServerMember", + "_id": { + "user": "__ID:2__", + "server": "__ID:4__" + }, + "joined_at": 1698318340195 + } +] \ No newline at end of file diff --git a/crates/delta/src/routes/servers/roles_edit_positions.rs b/crates/delta/src/routes/servers/roles_edit_positions.rs index 2c4a6fe5..6bd80317 100644 --- a/crates/delta/src/routes/servers/roles_edit_positions.rs +++ b/crates/delta/src/routes/servers/roles_edit_positions.rs @@ -72,3 +72,54 @@ pub async fn edit_role_ranks( Ok(Json(server.into())) } + +#[cfg(test)] +mod test { + use revolt_database::fixture; + use revolt_models::v0; + use rocket::http::{ContentType, Header, Status}; + + use crate::util::test::TestHarness; + + #[rocket::async_test] + async fn edit_role_rankings() { + let harness = TestHarness::new().await; + + fixture!(harness.db, "server_with_roles", + owner user 0 + moderator user 1 + user user 2 + server server 4); + + // Moderator can re-order the roles below them + let (_, moderator_session) = harness.account_from_user(moderator.id).await; + let mut target_order: Vec = server + .ordered_roles() + .into_iter() + .map(|(id, _)| id) + .collect(); + + // Swap the two lower ranked roles + target_order.swap(2, 3); + + let response = harness + .client + .post(format!("/servers/{}/roles/ranks", server.id)) + .header(ContentType::JSON) + .body( + json!(v0::DataEditRoleRanks { + ranks: target_order.clone() + }) + .to_string(), + ) + .header(Header::new( + "x-session-token", + moderator_session.token.to_string(), + )) + .dispatch() + .await; + + assert_eq!(response.status(), Status::Ok); + drop(response); + } +} diff --git a/crates/delta/src/util/test.rs b/crates/delta/src/util/test.rs index e600ac15..067f8bd0 100644 --- a/crates/delta/src/util/test.rs +++ b/crates/delta/src/util/test.rs @@ -1,5 +1,5 @@ use authifier::{ - models::{Account, Session}, + models::{Account, EmailVerification, Session}, Authifier, }; use futures::StreamExt; @@ -83,30 +83,41 @@ impl TestHarness { } pub async fn new_user(&self) -> (Account, Session, User) { - let account = Account::new( - &self.authifier, - format!("{}@revolt.chat", TestHarness::rand_string()), - "password".to_string(), - false, - ) - .await - .expect("`Account`"); + let user = User::create(&self.db, TestHarness::rand_string(), None, None) + .await + .expect("`User`"); + + let (account, session) = self.account_from_user(user.id.clone()).await; + + (account, session, user) + } + + pub async fn account_from_user(&self, id: String) -> (Account, Session) { + let account = Account { + id, + email: format!("{}@revolt.chat", TestHarness::rand_string()), + password: Default::default(), + email_normalised: Default::default(), + deletion: None, + disabled: false, + lockout: None, + mfa: Default::default(), + password_reset: None, + verification: EmailVerification::Verified, + }; + + self.authifier + .database + .save_account(&account) + .await + .expect("`Account`"); let session = account .create_session(&self.authifier, String::new()) .await .expect("`Session`"); - let user = User::create( - &self.db, - TestHarness::rand_string(), - account.id.to_string(), - None, - ) - .await - .expect("`User`"); - - (account, session, user) + (account, session) } pub async fn new_server(&self, user: &User) -> (Server, Vec) {