Files

199 lines
6.3 KiB
Rust

use crate::api::main::{create_user_with_password, login_user, setup};
use axum::http::StatusCode;
use http_body_util::BodyExt;
use serde_json::{json, Value};
use utils::testing::{make_get_request, make_jwt_request};
#[tokio::test]
async fn test_search_all() {
let app = setup().await;
// 1. Setup users and data
let user1 =
create_user_with_password(&app.db, "search_user1", "password123", "s1@test.com").await;
let user2 =
create_user_with_password(&app.db, "search_user2", "password123", "s2@test.com").await;
let _user3 =
create_user_with_password(&app.db, "stranger_user", "password123", "s3@test.com").await;
// Make user1 and user2 friends
app::persistence::follow::follow_user(&app.db, user1.id, user2.id)
.await
.unwrap();
app::persistence::follow::follow_user(&app.db, user2.id, user1.id)
.await
.unwrap();
let token1 = login_user(app.router.clone(), "search_user1", "password123").await;
let token2 = login_user(app.router.clone(), "search_user2", "password123").await;
let token3 = login_user(app.router.clone(), "stranger_user", "password123").await;
// User1 posts thoughts with different visibilities
let thought_public =
json!({ "content": "A very public thought about Rust.", "visibility": "Public" })
.to_string();
let thought_friends =
json!({ "content": "A friendly thought, just for pals.", "visibility": "FriendsOnly" })
.to_string();
let thought_private =
json!({ "content": "A private thought, for my eyes only.", "visibility": "Private" })
.to_string();
make_jwt_request(
app.router.clone(),
"/thoughts",
"POST",
Some(thought_public),
&token1,
)
.await;
make_jwt_request(
app.router.clone(),
"/thoughts",
"POST",
Some(thought_friends),
&token1,
)
.await;
make_jwt_request(
app.router.clone(),
"/thoughts",
"POST",
Some(thought_private),
&token1,
)
.await;
// 2. Run search tests
// -- User Search --
let response = make_get_request(app.router.clone(), "/search?q=search_user1", None).await;
assert_eq!(response.status(), StatusCode::OK);
let body = response.into_body().collect().await.unwrap().to_bytes();
let v: Value = serde_json::from_slice(&body).unwrap();
assert_eq!(v["users"]["users"].as_array().unwrap().len(), 1);
assert_eq!(v["users"]["users"][0]["username"], "search_user1");
// -- Thought Search (Public) --
let response = make_get_request(app.router.clone(), "/search?q=public", None).await;
assert_eq!(response.status(), StatusCode::OK);
let body = response.into_body().collect().await.unwrap().to_bytes();
let v: Value = serde_json::from_slice(&body).unwrap();
assert_eq!(
v["thoughts"]["thoughts"].as_array().unwrap().len(),
1,
"Guest should find public thought"
);
assert!(v["thoughts"]["thoughts"][0]["content"]
.as_str()
.unwrap()
.contains("public"));
// -- Thought Search (FriendsOnly) --
let response = make_jwt_request(
app.router.clone(),
"/search?q=friendly",
"GET",
None,
&token1,
)
.await;
assert_eq!(response.status(), StatusCode::OK);
let body = response.into_body().collect().await.unwrap().to_bytes();
let v: Value = serde_json::from_slice(&body).unwrap();
assert_eq!(
v["thoughts"]["thoughts"].as_array().unwrap().len(),
1,
"Author should find friends thought"
);
let response = make_jwt_request(
app.router.clone(),
"/search?q=friendly",
"GET",
None,
&token2,
)
.await;
assert_eq!(response.status(), StatusCode::OK);
let body = response.into_body().collect().await.unwrap().to_bytes();
let v: Value = serde_json::from_slice(&body).unwrap();
assert_eq!(
v["thoughts"]["thoughts"].as_array().unwrap().len(),
1,
"Friend should find friends thought"
);
let response = make_jwt_request(
app.router.clone(),
"/search?q=friendly",
"GET",
None,
&token3,
)
.await;
assert_eq!(response.status(), StatusCode::OK);
let body = response.into_body().collect().await.unwrap().to_bytes();
let v: Value = serde_json::from_slice(&body).unwrap();
assert_eq!(
v["thoughts"]["thoughts"].as_array().unwrap().len(),
0,
"Stranger should NOT find friends thought"
);
let response = make_get_request(app.router.clone(), "/search?q=friendly", None).await;
assert_eq!(response.status(), StatusCode::OK);
let body = response.into_body().collect().await.unwrap().to_bytes();
let v: Value = serde_json::from_slice(&body).unwrap();
assert_eq!(
v["thoughts"]["thoughts"].as_array().unwrap().len(),
0,
"Guest should NOT find friends thought"
);
// -- Thought Search (Private) --
let response = make_jwt_request(
app.router.clone(),
"/search?q=private",
"GET",
None,
&token1,
)
.await;
assert_eq!(response.status(), StatusCode::OK);
let body = response.into_body().collect().await.unwrap().to_bytes();
let v: Value = serde_json::from_slice(&body).unwrap();
assert_eq!(
v["thoughts"]["thoughts"].as_array().unwrap().len(),
1,
"Author should find private thought"
);
let response = make_jwt_request(
app.router.clone(),
"/search?q=private",
"GET",
None,
&token2,
)
.await;
assert_eq!(response.status(), StatusCode::OK);
let body = response.into_body().collect().await.unwrap().to_bytes();
let v: Value = serde_json::from_slice(&body).unwrap();
assert_eq!(
v["thoughts"]["thoughts"].as_array().unwrap().len(),
0,
"Friend should NOT find private thought"
);
let response = make_get_request(app.router.clone(), "/search?q=private", None).await;
assert_eq!(response.status(), StatusCode::OK);
let body = response.into_body().collect().await.unwrap().to_bytes();
let v: Value = serde_json::from_slice(&body).unwrap();
assert_eq!(
v["thoughts"]["thoughts"].as_array().unwrap().len(),
0,
"Guest should NOT find private thought"
);
}