From d30ceea373f978a5f8e47b6a56cc3f136eae263b Mon Sep 17 00:00:00 2001 From: izzy Date: Sun, 8 Jun 2025 11:32:42 +0100 Subject: [PATCH] test: complete test for editing role positions --- .../database/fixtures/server_with_roles.json | 16 ----- .../admin_migrations/ops/mongodb/scripts.rs | 36 ++++++++---- crates/delta/fixtures/group_with_members.json | 28 --------- ...roles.json => server_with_many_roles.json} | 5 +- .../routes/servers/roles_edit_positions.rs | 58 ++++++++++++++++++- 5 files changed, 83 insertions(+), 60 deletions(-) delete mode 100644 crates/delta/fixtures/group_with_members.json rename crates/delta/fixtures/{server_with_roles.json => server_with_many_roles.json} (89%) diff --git a/crates/core/database/fixtures/server_with_roles.json b/crates/core/database/fixtures/server_with_roles.json index 68e6045b..0a76489d 100644 --- a/crates/core/database/fixtures/server_with_roles.json +++ b/crates/core/database/fixtures/server_with_roles.json @@ -61,22 +61,6 @@ "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/core/database/src/models/admin_migrations/ops/mongodb/scripts.rs b/crates/core/database/src/models/admin_migrations/ops/mongodb/scripts.rs index 40efe91a..d164cab1 100644 --- a/crates/core/database/src/models/admin_migrations/ops/mongodb/scripts.rs +++ b/crates/core/database/src/models/admin_migrations/ops/mongodb/scripts.rs @@ -1,10 +1,15 @@ -use std::{collections::{HashMap, HashSet}, ops::BitXor, time::Duration}; +use std::{ + collections::{HashMap, HashSet}, + ops::BitXor, + time::Duration, +}; use crate::{ mongodb::{ bson::{doc, from_bson, from_document, to_document, Bson, DateTime, Document}, options::FindOptions, - }, AbstractChannels, AbstractServers, Channel, Invite, MongoDb, Server, User, DISCRIMINATOR_SEARCH_SPACE + }, + AbstractChannels, AbstractServers, Channel, Invite, MongoDb, User, DISCRIMINATOR_SEARCH_SPACE, }; use bson::{oid::ObjectId, to_bson}; use futures::StreamExt; @@ -1165,7 +1170,9 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { } if revision <= 41 { - info!("Running migration [revision 41 / 05-06-2025]: convert role ranks to uniform numbers."); + info!( + "Running migration [revision 41 / 05-06-2025]: convert role ranks to uniform numbers." + ); #[derive(Serialize, Deserialize, Clone)] struct Role { @@ -1180,7 +1187,8 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { pub roles: HashMap, } - let mut servers = db.db() + let mut servers = db + .db() .collection::("servers") .find(doc! { "roles": { @@ -1196,19 +1204,23 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { while let Some(server) = servers.next().await { let mut ordered_roles = server.roles.clone().into_iter().collect::>(); ordered_roles.sort_by(|(_, role_a), (_, role_b)| role_a.rank.cmp(&role_b.rank)); - let ordered_roles = ordered_roles.into_iter().map(|(id, _)| id).collect::>(); + let ordered_roles = ordered_roles + .into_iter() + .map(|(id, _)| id) + .collect::>(); let mut doc = doc! {}; for id in server.roles.keys() { - doc.insert(format!("roles.{id}.rank"), ordered_roles.iter().position(|x| id == x).unwrap() as i64); - }; + doc.insert( + format!("roles.{id}.rank"), + ordered_roles.iter().position(|x| id == x).unwrap() as i64, + ); + } - db.db().collection::("servers") - .update_one( - doc! { "_id": &server.id }, - doc! { "$set": doc } - ) + db.db() + .collection::("servers") + .update_one(doc! { "_id": &server.id }, doc! { "$set": doc }) .await .unwrap(); } diff --git a/crates/delta/fixtures/group_with_members.json b/crates/delta/fixtures/group_with_members.json deleted file mode 100644 index a4544176..00000000 --- a/crates/delta/fixtures/group_with_members.json +++ /dev/null @@ -1,28 +0,0 @@ -[ - { - "_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_many_roles.json similarity index 89% rename from crates/delta/fixtures/server_with_roles.json rename to crates/delta/fixtures/server_with_many_roles.json index 8eb61601..49cfe276 100644 --- a/crates/delta/fixtures/server_with_roles.json +++ b/crates/delta/fixtures/server_with_many_roles.json @@ -3,18 +3,21 @@ "_object_type": "User", "_id": "__ID:0__", "username": "Owner", + "last_acknowledged_policy_change": "2025-06-07T04:04:48+0000", "discriminator": "0001" }, { "_object_type": "User", "_id": "__ID:1__", "username": "Moderator", + "last_acknowledged_policy_change": "2025-06-07T04:04:48+0000", "discriminator": "0001" }, { "_object_type": "User", "_id": "__ID:2__", "username": "User", + "last_acknowledged_policy_change": "2025-06-07T04:04:48+0000", "discriminator": "0001" }, { @@ -46,7 +49,7 @@ "__ID:5__": { "name": "Moderator", "permissions": { - "a": 545270208, + "a": 545270216, "d": 0 }, "rank": 1 diff --git a/crates/delta/src/routes/servers/roles_edit_positions.rs b/crates/delta/src/routes/servers/roles_edit_positions.rs index 6bd80317..59614162 100644 --- a/crates/delta/src/routes/servers/roles_edit_positions.rs +++ b/crates/delta/src/routes/servers/roles_edit_positions.rs @@ -85,10 +85,9 @@ mod test { async fn edit_role_rankings() { let harness = TestHarness::new().await; - fixture!(harness.db, "server_with_roles", + fixture!(harness.db, "server_with_many_roles", owner user 0 moderator user 1 - user user 2 server server 4); // Moderator can re-order the roles below them @@ -104,7 +103,7 @@ mod test { let response = harness .client - .post(format!("/servers/{}/roles/ranks", server.id)) + .patch(format!("/servers/{}/roles/ranks", server.id)) .header(ContentType::JSON) .body( json!(v0::DataEditRoleRanks { @@ -121,5 +120,58 @@ mod test { assert_eq!(response.status(), Status::Ok); drop(response); + + // ... but not above them + let mut target_order: Vec = server + .ordered_roles() + .into_iter() + .map(|(id, _)| id) + .collect(); + + // Swap the two lower ranked roles + target_order.swap(0, 1); + + let response = harness + .client + .patch(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::Forbidden); + drop(response); + + // The owner can set any order they want + let (_, owner_session) = harness.account_from_user(owner.id).await; + + let response = harness + .client + .patch(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", + owner_session.token.to_string(), + )) + .dispatch() + .await; + + assert_eq!(response.status(), Status::Ok); + drop(response); } }