feat(server): busca FTS5 com filtros e paginacao

This commit is contained in:
2026-08-05 20:35:17 -03:00
parent 2564c33748
commit 1d1de4bcec
7 changed files with 169 additions and 0 deletions
+60
View File
@@ -0,0 +1,60 @@
mod common;
use common::{announce_test_file, test_server};
use serde_json::json;
#[tokio::test]
async fn search_by_name_filters() {
let server = test_server();
for (name, ty, hash) in [
("musica-bossa.ogg", "audio", "a1".repeat(32)),
("musica-rock.mp3", "audio", "a2".repeat(32)),
("ebook-p2p.pdf", "document", "a3".repeat(32)),
] {
announce_test_file(&server, name, ty, &hash).await;
}
let res = server.get("/api/v1/search?q=musica").await;
assert_eq!(res.status_code(), 200);
let items = res.json::<Vec<serde_json::Value>>();
assert_eq!(items.len(), 2);
}
#[tokio::test]
async fn search_filter_by_type() {
let server = test_server();
for (name, ty, hash) in [
("musica-bossa.ogg", "audio", "a1".repeat(32)),
("musica-rock.mp3", "audio", "a2".repeat(32)),
("ebook-p2p.pdf", "document", "a3".repeat(32)),
] {
announce_test_file(&server, name, ty, &hash).await;
}
let res = server.get("/api/v1/search?q=musica&ftype=audio").await;
let items = res.json::<Vec<serde_json::Value>>();
assert_eq!(items.len(), 2);
assert_eq!(items[0]["ftype"], "audio");
}
#[tokio::test]
async fn search_pagination() {
let server = test_server();
for (name, ty, hash) in [
("musica-bossa.ogg", "audio", "a1".repeat(32)),
("musica-rock.mp3", "audio", "a2".repeat(32)),
("ebook-p2p.pdf", "document", "a3".repeat(32)),
] {
announce_test_file(&server, name, ty, &hash).await;
}
let res = server.get("/api/v1/search?q=&limit=1&offset=0").await;
let items = res.json::<Vec<serde_json::Value>>();
assert_eq!(items.len(), 1);
}
#[tokio::test]
async fn search_empty_results() {
let server = test_server();
let res = server.get("/api/v1/search?q=inexistente").await;
assert_eq!(res.status_code(), 200);
let items = res.json::<Vec<serde_json::Value>>();
assert_eq!(items.len(), 0);
}