folder tree

This commit is contained in:
2025-11-06 00:51:38 +01:00
parent 911051e75d
commit 4027ac66cb
5 changed files with 300 additions and 37 deletions
+71
View File
@@ -32,6 +32,12 @@ struct DocSummary {
id: Uuid,
}
#[derive(Deserialize)]
struct FolderTreeNodeResponse {
name: String,
children: Vec<FolderTreeNodeResponse>,
}
#[derive(Serialize)]
struct CreateFolder<'a> {
name: &'a str,
@@ -144,6 +150,71 @@ async fn folder_move_and_delete_flow() -> Result<()> {
Ok(())
}
#[tokio::test]
async fn folder_tree_lists_hierarchy() -> Result<()> {
let _lock = acquire_db_lock().await;
let app = TestApp::new().await?;
let password = "folderpass";
app.insert_user("folder-tree", password, "admin").await?;
let token = app.login_token("folder-tree", password).await?;
let alpha_resp = app
.post_json(
"/api/folders",
&CreateFolder {
name: "Alpha",
parent_id: None,
},
Some(&token),
)
.await?;
assert_eq!(alpha_resp.status(), StatusCode::CREATED);
let alpha_body = body_to_vec(alpha_resp.into_body()).await?;
let alpha: FolderResponse = serde_json::from_slice(&alpha_body)?;
let archive_resp = app
.post_json(
"/api/folders",
&CreateFolder {
name: "Archive",
parent_id: Some(alpha.folder.id),
},
Some(&token),
)
.await?;
assert_eq!(archive_resp.status(), StatusCode::CREATED);
let beta_resp = app
.post_json(
"/api/folders",
&CreateFolder {
name: "Beta",
parent_id: None,
},
Some(&token),
)
.await?;
assert_eq!(beta_resp.status(), StatusCode::CREATED);
let tree_resp = app.get("/api/folders/tree", Some(&token)).await?;
assert_eq!(tree_resp.status(), StatusCode::OK);
let tree_body = body_to_vec(tree_resp.into_body()).await?;
let tree: Vec<FolderTreeNodeResponse> = serde_json::from_slice(&tree_body)?;
assert_eq!(tree.len(), 2);
assert_eq!(tree[0].name, "Alpha");
assert_eq!(tree[0].children.len(), 1);
assert_eq!(tree[0].children[0].name, "Archive");
assert!(tree[0].children[0].children.is_empty());
assert_eq!(tree[1].name, "Beta");
assert!(tree[1].children.is_empty());
app.cleanup().await?;
Ok(())
}
#[tokio::test]
async fn update_folder_parent_to_root() -> Result<()> {
let _lock = acquire_db_lock().await;