1
0
Fork 0
mirror of https://github.com/Nutomic/ibis.git synced 2024-12-05 02:31:09 +00:00

Fix test cases

This commit is contained in:
Felix Ableitner 2024-11-25 14:56:57 +01:00
parent 805c669d00
commit c21d6fe08c
7 changed files with 33 additions and 30 deletions

View file

@ -5,12 +5,7 @@ edition = "2021"
[features] [features]
default = ["ssr"] default = ["ssr"]
ssr = [ ssr = ["katex/duktape", "leptos/ssr", "leptos-use/ssr", "leptos-use/axum"]
"katex/duktape",
"leptos/ssr",
"leptos-use/ssr",
"leptos-use/axum",
]
hydrate = ["leptos/hydrate", "katex/wasm-js"] hydrate = ["leptos/hydrate", "katex/wasm-js"]
# This profile significantly speeds up build time. If debug info is needed you can comment the line # This profile significantly speeds up build time. If debug info is needed you can comment the line
@ -101,10 +96,7 @@ async-trait = { version = "0.1.83" }
config = { version = "0.14.1", features = ["toml"] } config = { version = "0.14.1", features = ["toml"] }
tower = { version = "0.5.1" } tower = { version = "0.5.1" }
tower-layer = { version = "0.3.3" } tower-layer = { version = "0.3.3" }
reqwest = { version = "0.12.9", features = [ reqwest = { version = "0.12.9", features = ["json", "cookies"] }
"json",
"cookies",
] }
futures = "0.3.31" futures = "0.3.31"
env_logger = { version = "0.11.5", default-features = false } env_logger = { version = "0.11.5", default-features = false }

View file

@ -161,6 +161,7 @@ pub(in crate::backend::api) async fn get_article(
Query(query): Query<GetArticleForm>, Query(query): Query<GetArticleForm>,
data: Data<IbisData>, data: Data<IbisData>,
) -> MyResult<Json<ArticleView>> { ) -> MyResult<Json<ArticleView>> {
dbg!(&query);
match (query.title, query.id) { match (query.title, query.id) {
(Some(title), None) => Ok(Json(DbArticle::read_view_title( (Some(title), None) => Ok(Json(DbArticle::read_view_title(
&title, &title,

View file

@ -3,11 +3,11 @@ use crate::{
common::{ common::{
DbInstance, DbInstance,
FollowInstance, FollowInstance,
FollowInstanceResponse,
GetInstance, GetInstance,
InstanceView, InstanceView,
LocalUserView, LocalUserView,
ResolveObject, ResolveObject,
SuccessResponse,
}, },
}; };
use activitypub_federation::{config::Data, fetch::object_id::ObjectId}; use activitypub_federation::{config::Data, fetch::object_id::ObjectId};
@ -31,13 +31,13 @@ pub(in crate::backend::api) async fn follow_instance(
Extension(user): Extension<LocalUserView>, Extension(user): Extension<LocalUserView>,
data: Data<IbisData>, data: Data<IbisData>,
Form(query): Form<FollowInstance>, Form(query): Form<FollowInstance>,
) -> MyResult<Json<FollowInstanceResponse>> { ) -> MyResult<Json<SuccessResponse>> {
let target = DbInstance::read(query.id, &data)?; let target = DbInstance::read(query.id, &data)?;
let pending = !target.local; let pending = !target.local;
DbInstance::follow(&user.person, &target, pending, &data)?; DbInstance::follow(&user.person, &target, pending, &data)?;
let instance = DbInstance::read(query.id, &data)?; let instance = DbInstance::read(query.id, &data)?;
Follow::send(user.person, &instance, &data).await?; Follow::send(user.person, &instance, &data).await?;
Ok(Json(FollowInstanceResponse { success: true })) Ok(Json(SuccessResponse::default()))
} }
/// Fetch a remote instance actor. This automatically synchronizes the remote articles collection to /// Fetch a remote instance actor. This automatically synchronizes the remote articles collection to

View file

@ -63,7 +63,7 @@ pub fn api_routes() -> Router<()> {
.route("/user/notifications/count", get(count_notifications)) .route("/user/notifications/count", get(count_notifications))
.route("/account/register", post(register_user)) .route("/account/register", post(register_user))
.route("/account/login", post(login_user)) .route("/account/login", post(login_user))
.route("/account/logout", get(logout_user)) .route("/account/logout", post(logout_user))
.route("/site", get(site_view)) .route("/site", get(site_view))
.route_layer(middleware::from_fn(auth)) .route_layer(middleware::from_fn(auth))
} }

View file

@ -12,6 +12,7 @@ use crate::{
LoginUserForm, LoginUserForm,
Notification, Notification,
RegisterUserForm, RegisterUserForm,
SuccessResponse,
AUTH_COOKIE, AUTH_COOKIE,
}, },
}; };
@ -125,9 +126,9 @@ fn create_cookie(jwt: String, data: &Data<IbisData>) -> Cookie<'static> {
pub(in crate::backend::api) async fn logout_user( pub(in crate::backend::api) async fn logout_user(
data: Data<IbisData>, data: Data<IbisData>,
jar: CookieJar, jar: CookieJar,
) -> MyResult<CookieJar> { ) -> MyResult<(CookieJar, Json<SuccessResponse>)> {
let jar = jar.remove(create_cookie(String::new(), &data)); let jar = jar.remove(create_cookie(String::new(), &data));
Ok(jar) Ok((jar, Json(SuccessResponse::default())))
} }
#[debug_handler] #[debug_handler]

View file

@ -245,8 +245,14 @@ pub struct FollowInstance {
} }
#[derive(Deserialize, Serialize, Debug)] #[derive(Deserialize, Serialize, Debug)]
pub struct FollowInstanceResponse { pub struct SuccessResponse {
pub success: bool, success: bool,
}
impl Default for SuccessResponse {
fn default() -> Self {
Self { success: true }
}
} }
#[derive(Deserialize, Serialize, Clone, Debug)] #[derive(Deserialize, Serialize, Clone, Debug)]

View file

@ -12,7 +12,6 @@ use crate::{
DeleteConflictForm, DeleteConflictForm,
EditArticleForm, EditArticleForm,
FollowInstance, FollowInstance,
FollowInstanceResponse,
ForkArticleForm, ForkArticleForm,
GetArticleForm, GetArticleForm,
GetInstance, GetInstance,
@ -27,6 +26,7 @@ use crate::{
ResolveObject, ResolveObject,
SearchArticleForm, SearchArticleForm,
SiteView, SiteView,
SuccessResponse,
}, },
frontend::error::MyResult, frontend::error::MyResult,
}; };
@ -105,7 +105,8 @@ impl ApiClient {
&self, &self,
edit_form: &EditArticleForm, edit_form: &EditArticleForm,
) -> MyResult<Option<ApiConflict>> { ) -> MyResult<Option<ApiConflict>> {
self.get("/api/v1/article", Some(&edit_form)).await self.send(Method::PATCH, "/api/v1/article", Some(&edit_form))
.await
} }
pub async fn edit_article(&self, edit_form: &EditArticleForm) -> MyResult<ArticleView> { pub async fn edit_article(&self, edit_form: &EditArticleForm) -> MyResult<ArticleView> {
@ -180,10 +181,7 @@ impl ApiClient {
Ok(instance_resolved) Ok(instance_resolved)
} }
pub async fn follow_instance( pub async fn follow_instance(&self, follow_form: FollowInstance) -> MyResult<SuccessResponse> {
&self,
follow_form: FollowInstance,
) -> MyResult<FollowInstanceResponse> {
self.post("/api/v1/instance/follow", Some(follow_form)) self.post("/api/v1/instance/follow", Some(follow_form))
.await .await
} }
@ -192,8 +190,8 @@ impl ApiClient {
self.get("/api/v1/site", None::<()>).await self.get("/api/v1/site", None::<()>).await
} }
pub async fn logout(&self) -> MyResult<()> { pub async fn logout(&self) -> MyResult<SuccessResponse> {
self.get("/api/v1/account/logout", None::<()>).await self.post("/api/v1/account/logout", None::<()>).await
} }
pub async fn fork_article(&self, form: &ForkArticleForm) -> MyResult<ArticleView> { pub async fn fork_article(&self, form: &ForkArticleForm) -> MyResult<ArticleView> {
@ -246,8 +244,12 @@ impl ApiClient {
use reqwest::header::HeaderName; use reqwest::header::HeaderName;
let mut req = self let mut req = self
.client .client
.request(method, self.request_endpoint(path)) .request(method.clone(), self.request_endpoint(path));
.query(&params); req = if method == Method::GET {
req.query(&params)
} else {
req.form(&params)
};
let auth = use_context::<Auth>(); let auth = use_context::<Auth>();
if let Some(Auth(Some(auth))) = auth { if let Some(Auth(Some(auth))) = auth {
req = req.header(HeaderName::from_static(AUTH_COOKIE), auth); req = req.header(HeaderName::from_static(AUTH_COOKIE), auth);
@ -288,17 +290,18 @@ impl ApiClient {
let path_with_endpoint = self.request_endpoint(path); let path_with_endpoint = self.request_endpoint(path);
let params_encoded = serde_urlencoded::to_string(&params).unwrap(); let params_encoded = serde_urlencoded::to_string(&params).unwrap();
let path = if method == Method::GET { let path = if method == Method::GET {
// Cannot pass the struct directly but need to convert it manually // Cannot pass the form data directly but need to convert it manually
// https://github.com/rustwasm/gloo/issues/378 // https://github.com/rustwasm/gloo/issues/378
format!("{path_with_endpoint}?{params_encoded}") format!("{path_with_endpoint}?{params_encoded}")
} else { } else {
path_with_endpoint path_with_endpoint
}; };
let builder = RequestBuilder::new(&path) let builder = RequestBuilder::new(&path)
.method(method.clone()) .method(method.clone())
.abort_signal(abort_signal.as_ref()) .abort_signal(abort_signal.as_ref())
.credentials(RequestCredentials::Include); .credentials(RequestCredentials::Include);
let req = if method == Method::POST { let req = if method != Method::GET {
builder builder
.header("content-type", "application/x-www-form-urlencoded") .header("content-type", "application/x-www-form-urlencoded")
.body(params_encoded) .body(params_encoded)