diff --git a/src/api/article.rs b/src/api/article.rs index dbcbdf8..540b1a5 100644 --- a/src/api/article.rs +++ b/src/api/article.rs @@ -145,6 +145,7 @@ pub struct ForkArticleData { /// how an article should be edited. #[debug_handler] pub(in crate::api) async fn fork_article( + Extension(_user): Extension, data: Data, Form(fork_form): Form, ) -> MyResult> { diff --git a/src/api/user.rs b/src/api/user.rs index 06fa3df..d70a893 100644 --- a/src/api/user.rs +++ b/src/api/user.rs @@ -54,7 +54,7 @@ pub async fn validate(jwt: &str, data: &Data) -> MyResult, Form(form): Form, ) -> MyResult> { - let user = DbPerson::create_local(form.name, form.password, &data)?; + let user = DbPerson::create_local(form.username, form.password, &data)?; Ok(Json(generate_login_token(user.local_user, &data)?)) } #[derive(Deserialize, Serialize)] pub struct LoginUserData { - name: String, - password: String, + pub username: String, + pub password: String, } #[debug_handler] @@ -83,7 +83,7 @@ pub(in crate::api) async fn login_user( data: Data, Form(form): Form, ) -> MyResult> { - let user = DbPerson::read_local_from_name(&form.name, &data)?; + let user = DbPerson::read_local_from_name(&form.username, &data)?; let valid = verify(&form.password, &user.local_user.password_encrypted)?; if !valid { return Err(anyhow!("Invalid login").into()); diff --git a/tests/common.rs b/tests/common.rs index 2f9e822..c63bcc0 100644 --- a/tests/common.rs +++ b/tests/common.rs @@ -1,8 +1,8 @@ use anyhow::anyhow; -use fediwiki::api::article::{CreateArticleData, EditArticleData, GetArticleData}; +use fediwiki::api::article::{CreateArticleData, EditArticleData, ForkArticleData, GetArticleData}; use fediwiki::api::instance::FollowInstance; -use fediwiki::api::user::LoginResponse; use fediwiki::api::user::RegisterUserData; +use fediwiki::api::user::{LoginResponse, LoginUserData}; use fediwiki::api::ResolveObject; use fediwiki::database::article::ArticleView; use fediwiki::database::conflict::ApiConflict; @@ -119,16 +119,12 @@ impl FediwikiInstance { let handle = tokio::task::spawn(async move { start(&hostname_, &db_url).await.unwrap(); }); - let register_form = RegisterUserData { - name: username.to_string(), - password: "hunter2".to_string(), - }; - let register: LoginResponse = post(&hostname, "user/register", ®ister_form) - .await - .unwrap(); - assert!(!register.jwt.is_empty()); + // wait a moment for the server to start + tokio::time::sleep(Duration::from_millis(100)).await; + let register_res = register(&hostname, username, "hunter2").await.unwrap(); + assert!(!register_res.jwt.is_empty()); Self { - jwt: register.jwt, + jwt: register_res.jwt, hostname, db_path, db_handle: handle, @@ -214,13 +210,14 @@ where handle_json_res(req).await } -pub async fn post(hostname: &str, endpoint: &str, form: &T) -> MyResult -where - R: for<'de> Deserialize<'de>, -{ +pub async fn fork_article( + instance: &FediwikiInstance, + form: &ForkArticleData, +) -> MyResult { let req = CLIENT - .post(format!("http://{}/api/v1/{}", hostname, endpoint)) - .form(form); + .post(format!("http://{}/api/v1/article/fork", instance.hostname)) + .form(form) + .bearer_auth(&instance.jwt); handle_json_res(req).await } @@ -262,3 +259,29 @@ pub async fn follow_instance(api_instance: &str, follow_instance: &str) -> MyRes Err(anyhow!("API error: {}", res.text().await?).into()) } } + +pub async fn register(hostname: &str, username: &str, password: &str) -> MyResult { + let register_form = RegisterUserData { + username: username.to_string(), + password: password.to_string(), + }; + let req = CLIENT + .post(format!("http://{}/api/v1/user/register", hostname)) + .form(®ister_form); + handle_json_res(req).await +} + +pub async fn login( + instance: &FediwikiInstance, + username: &str, + password: &str, +) -> MyResult { + let login_form = LoginUserData { + username: username.to_string(), + password: password.to_string(), + }; + let req = CLIENT + .post(format!("http://{}/api/v1/user/login", instance.hostname)) + .form(&login_form); + handle_json_res(req).await +} diff --git a/tests/test.rs b/tests/test.rs index 160aa6b..b48d93f 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -2,14 +2,14 @@ extern crate fediwiki; mod common; -use crate::common::handle_json_res; +use crate::common::register; use crate::common::{ create_article, edit_article, edit_article_with_conflict, follow_instance, get_article, - get_query, post, TestData, CLIENT, TEST_ARTICLE_DEFAULT_TEXT, + get_query, TestData, CLIENT, TEST_ARTICLE_DEFAULT_TEXT, }; +use crate::common::{fork_article, handle_json_res, login}; use common::get; use fediwiki::api::article::{CreateArticleData, EditArticleData, ForkArticleData}; -use fediwiki::api::user::{LoginResponse, RegisterUserData}; use fediwiki::api::{ResolveObject, SearchArticleData}; use fediwiki::database::article::{ArticleView, DbArticle}; use fediwiki::database::conflict::ApiConflict; @@ -441,7 +441,7 @@ async fn test_fork_article() -> MyResult<()> { let fork_form = ForkArticleData { article_id: resolved_article.id, }; - let fork_res: ArticleView = post(&data.beta.hostname, "article/fork", &fork_form).await?; + let fork_res = fork_article(&data.beta, &fork_form).await?; let forked_article = fork_res.article; assert_eq!(resolved_article.title, forked_article.title); assert_eq!(resolved_article.text, forked_article.text); @@ -470,24 +470,15 @@ async fn test_fork_article() -> MyResult<()> { #[tokio::test] async fn test_user_registration_login() -> MyResult<()> { let data = TestData::start().await; - let register_form = RegisterUserData { - name: "my_user".to_string(), - password: "hunter2".to_string(), - }; - let register: LoginResponse = - post(&data.alpha.hostname, "user/register", ®ister_form).await?; + let username = "my_user"; + let password = "hunter2"; + let register = register(&data.alpha.hostname, username, password).await?; assert!(!register.jwt.is_empty()); - let mut login_form = RegisterUserData { - name: register_form.name.clone(), - password: "asd123".to_string(), - }; - let invalid_login = - post::<_, LoginResponse>(&data.alpha.hostname, "user/login", &login_form).await; + let invalid_login = login(&data.alpha, username, "asd123").await; assert!(invalid_login.is_err()); - login_form.password = register_form.password; - let valid_login: LoginResponse = post(&data.alpha.hostname, "user/login", &login_form).await?; + let valid_login = login(&data.alpha, username, password).await?; assert!(!valid_login.jwt.is_empty()); let title = "Manu_Chao".to_string();