diff --git a/rust-lib/flowy-test/src/builder.rs b/rust-lib/flowy-test/src/builder.rs index 0cd50e45ce..23eccd7921 100644 --- a/rust-lib/flowy-test/src/builder.rs +++ b/rust-lib/flowy-test/src/builder.rs @@ -48,8 +48,16 @@ where } } - pub fn login(mut self) -> Self { - let user_detail = self.tester.login(); + pub fn sign_up(self) -> SignUpContext { + let (user_detail, password) = self.tester.sign_up(); + SignUpContext { + user_detail, + password, + } + } + + pub fn sign_in(mut self) -> Self { + let user_detail = self.tester.sign_in(); self.user_detail = Some(user_detail); self } @@ -160,3 +168,8 @@ where fn context(&self) -> &TesterContext { &self.context } } + +pub struct SignUpContext { + pub user_detail: UserDetail, + pub password: String, +} diff --git a/rust-lib/flowy-test/src/tester.rs b/rust-lib/flowy-test/src/tester.rs index b8314a654c..85d62086f9 100644 --- a/rust-lib/flowy-test/src/tester.rs +++ b/rust-lib/flowy-test/src/tester.rs @@ -10,6 +10,7 @@ use flowy_user::{ prelude::*, }; +use flowy_user::event::UserEvent::SignIn; use std::{ convert::TryFrom, fmt::{Debug, Display}, @@ -105,12 +106,13 @@ pub trait TesterTrait { .into_inner() } - fn login(&self) -> UserDetail { + fn sign_up(&self) -> (UserDetail, String) { init_test_sdk(); + let password = valid_password(); let payload = SignUpRequest { email: self.context().user_email.clone(), name: "app flowy".to_string(), - password: valid_password(), + password: password.clone(), } .into_bytes() .unwrap(); @@ -121,6 +123,24 @@ pub trait TesterTrait { .unwrap() .unwrap(); + (user_detail, password) + } + + fn sign_in(&self) -> UserDetail { + init_test_sdk(); + let payload = SignInRequest { + email: self.context().user_email.clone(), + password: valid_password(), + } + .into_bytes() + .unwrap(); + + let request = ModuleRequest::new(SignIn).payload(payload); + let user_detail = EventDispatch::sync_send(request) + .parse::() + .unwrap() + .unwrap(); + user_detail } @@ -131,7 +151,7 @@ pub trait TesterTrait { .unwrap() { Ok(user_detail) => user_detail, - Err(_e) => self.login(), + Err(_e) => self.sign_in(), } } diff --git a/rust-lib/flowy-user/src/entities/user_detail.rs b/rust-lib/flowy-user/src/entities/user_detail.rs index c9b6aa7efc..a867afdeca 100644 --- a/rust-lib/flowy-user/src/entities/user_detail.rs +++ b/rust-lib/flowy-user/src/entities/user_detail.rs @@ -17,7 +17,7 @@ impl std::default::Default for UserStatus { fn default() -> Self { UserStatus::Unknown } } -#[derive(ProtoBuf, Default, Debug)] +#[derive(ProtoBuf, Default, Debug, PartialEq, Eq)] pub struct UserDetail { #[pb(index = 1)] pub id: String, @@ -85,7 +85,7 @@ impl UpdateUserRequest { } } -#[derive(ProtoBuf, Default)] +#[derive(ProtoBuf, Default, Clone)] pub struct UpdateUserParams { // TODO: remove user id #[pb(index = 1)] diff --git a/rust-lib/flowy-user/src/services/server/server_api_mock.rs b/rust-lib/flowy-user/src/services/server/server_api_mock.rs index 774d11af32..15a7ac5839 100644 --- a/rust-lib/flowy-user/src/services/server/server_api_mock.rs +++ b/rust-lib/flowy-user/src/services/server/server_api_mock.rs @@ -6,7 +6,7 @@ use crate::{ use crate::entities::UpdateUserParams; -use flowy_infra::future::ResultFuture; +use flowy_infra::{future::ResultFuture, uuid}; pub struct UserServerMock {} @@ -14,7 +14,7 @@ impl UserServerMock {} impl UserServerAPI for UserServerMock { fn sign_up(&self, params: SignUpParams) -> ResultFuture { - let uid = params.email.clone(); + let uid = uuid(); ResultFuture::new(async move { Ok(SignUpResponse { uid, @@ -28,7 +28,7 @@ impl UserServerAPI for UserServerMock { fn sign_in(&self, params: SignInParams) -> ResultFuture { ResultFuture::new(async { Ok(SignInResponse { - uid: "fake id".to_owned(), + uid: uuid(), name: "fake name".to_owned(), email: params.email, token: "fake token".to_string(), diff --git a/rust-lib/flowy-user/src/services/user/user_session.rs b/rust-lib/flowy-user/src/services/user/user_session.rs index af468eec58..e34a02e656 100644 --- a/rust-lib/flowy-user/src/services/user/user_session.rs +++ b/rust-lib/flowy-user/src/services/user/user_session.rs @@ -105,6 +105,19 @@ impl UserSession { } pub async fn update_user(&self, params: UpdateUserParams) -> Result<(), UserError> { + let session = self.get_session()?; + match self + .server + .update_user(&session.token, params.clone()) + .await + { + Ok(_) => {}, + Err(e) => { + // TODO: retry? + log::error!("update user profile failed: {:?}", e); + }, + } + let changeset = UserTableChangeset::new(params); let conn = self.get_db_connection()?; diesel_update_table!(user_table, changeset, conn); @@ -126,8 +139,7 @@ impl UserSession { log::info!("{:?}", e); }, } - }) - .await; + }); let user = dsl::user_table .filter(user_table::id.eq(&session.user_id)) diff --git a/rust-lib/flowy-user/tests/event/auth_test.rs b/rust-lib/flowy-user/tests/event/auth_test.rs new file mode 100644 index 0000000000..13034be9c7 --- /dev/null +++ b/rust-lib/flowy-user/tests/event/auth_test.rs @@ -0,0 +1,107 @@ +use crate::helper::*; +use flowy_user::{errors::ErrorCode, event::UserEvent::*, prelude::*}; +use serial_test::*; + +#[test] +#[serial] +fn sign_up_success() { + let user_detail = TestBuilder::new().sign_up().user_detail; + log::info!("{:?}", user_detail); +} + +#[test] +#[serial] +fn sign_up_with_invalid_email() { + for email in invalid_email_test_case() { + let request = SignUpRequest { + email: email.to_string(), + name: valid_name(), + password: valid_password(), + }; + + assert_eq!( + TestBuilder::new() + .event(SignUp) + .request(request) + .sync_send() + .error() + .code, + ErrorCode::EmailFormatInvalid + ); + } +} +#[test] +#[serial] +fn sign_up_with_invalid_password() { + for password in invalid_password_test_case() { + let request = SignUpRequest { + email: random_email(), + name: valid_name(), + password, + }; + + TestBuilder::new() + .event(SignUp) + .request(request) + .sync_send() + .assert_error(); + } +} + +#[test] +#[serial] +fn sign_in_success() { + let context = TestBuilder::new().sign_up(); + + let _ = TestBuilder::new().event(SignOut).sync_send(); + + let request = SignInRequest { + email: context.user_detail.email, + password: context.password, + }; + + let response = TestBuilder::new() + .event(SignIn) + .request(request) + .sync_send() + .parse::(); + dbg!(&response); +} + +#[test] +#[serial] +fn sign_in_with_invalid_email() { + for email in invalid_email_test_case() { + let request = SignInRequest { + email: email.to_string(), + password: valid_password(), + }; + + assert_eq!( + TestBuilder::new() + .event(SignIn) + .request(request) + .sync_send() + .error() + .code, + ErrorCode::EmailFormatInvalid + ); + } +} + +#[test] +#[serial] +fn sign_in_with_invalid_password() { + for password in invalid_password_test_case() { + let request = SignInRequest { + email: random_email(), + password, + }; + + TestBuilder::new() + .event(SignIn) + .request(request) + .sync_send() + .assert_error(); + } +} diff --git a/rust-lib/flowy-user/tests/event/main.rs b/rust-lib/flowy-user/tests/event/main.rs index f05894579e..587a1da4b9 100644 --- a/rust-lib/flowy-user/tests/event/main.rs +++ b/rust-lib/flowy-user/tests/event/main.rs @@ -1,5 +1,3 @@ +mod auth_test; mod helper; -mod sign_in_test; -mod sign_up_test; -mod user_detail_test; -mod user_update_test; +mod user_profile_test; diff --git a/rust-lib/flowy-user/tests/event/sign_in_test.rs b/rust-lib/flowy-user/tests/event/sign_in_test.rs deleted file mode 100644 index ecdcf04831..0000000000 --- a/rust-lib/flowy-user/tests/event/sign_in_test.rs +++ /dev/null @@ -1,58 +0,0 @@ -use crate::helper::*; -use flowy_user::{errors::ErrorCode, event::UserEvent::*, prelude::*}; -use serial_test::*; - -#[test] -#[serial] -fn sign_in_success() { - let request = SignInRequest { - email: random_email(), - password: valid_password(), - }; - - let response = TestBuilder::new() - .logout() - .event(SignIn) - .request(request) - .sync_send() - .parse::(); - dbg!(&response); -} - -#[test] -#[serial] -fn sign_in_with_invalid_email() { - for email in invalid_email_test_case() { - let request = SignInRequest { - email: email.to_string(), - password: valid_password(), - }; - - assert_eq!( - TestBuilder::new() - .event(SignIn) - .request(request) - .sync_send() - .error() - .code, - ErrorCode::EmailFormatInvalid - ); - } -} - -#[test] -#[serial] -fn sign_in_with_invalid_password() { - for password in invalid_password_test_case() { - let request = SignInRequest { - email: random_email(), - password, - }; - - TestBuilder::new() - .event(SignIn) - .request(request) - .sync_send() - .assert_error(); - } -} diff --git a/rust-lib/flowy-user/tests/event/sign_up_test.rs b/rust-lib/flowy-user/tests/event/sign_up_test.rs deleted file mode 100644 index 79fe31677a..0000000000 --- a/rust-lib/flowy-user/tests/event/sign_up_test.rs +++ /dev/null @@ -1,58 +0,0 @@ -use crate::helper::*; -use flowy_user::{errors::*, event::UserEvent::*, prelude::*}; -use serial_test::*; - -#[test] -#[serial] -fn sign_up_success() { - let request = SignUpRequest { - email: random_email(), - name: valid_name(), - password: valid_password(), - }; - - let _response = TestBuilder::new() - .logout() - .event(SignUp) - .request(request) - .sync_send(); -} - -#[test] -#[serial] -fn sign_up_with_invalid_email() { - for email in invalid_email_test_case() { - let request = SignUpRequest { - email: email.to_string(), - name: valid_name(), - password: valid_password(), - }; - - assert_eq!( - TestBuilder::new() - .event(SignUp) - .request(request) - .sync_send() - .error() - .code, - ErrorCode::EmailFormatInvalid - ); - } -} -#[test] -#[serial] -fn sign_up_with_invalid_password() { - for password in invalid_password_test_case() { - let request = SignUpRequest { - email: random_email(), - name: valid_name(), - password, - }; - - TestBuilder::new() - .event(SignUp) - .request(request) - .sync_send() - .assert_error(); - } -} diff --git a/rust-lib/flowy-user/tests/event/user_detail_test.rs b/rust-lib/flowy-user/tests/event/user_detail_test.rs deleted file mode 100644 index 7d2931732b..0000000000 --- a/rust-lib/flowy-user/tests/event/user_detail_test.rs +++ /dev/null @@ -1,34 +0,0 @@ -use crate::helper::*; -use flowy_user::{event::UserEvent::*, prelude::*}; -use serial_test::*; - -#[test] -#[serial] -fn user_status_get_failed() { - let _ = TestBuilder::new() - .logout() - .event(GetUserProfile) - .assert_error() - .sync_send(); -} - -#[test] -#[serial] -fn user_detail_get() { - let request = SignInRequest { - email: random_email(), - password: valid_password(), - }; - - let response = TestBuilder::new() - .event(SignIn) - .request(request) - .sync_send() - .parse::(); - dbg!(&response); - - let _ = TestBuilder::new() - .event(GetUserProfile) - .sync_send() - .parse::(); -} diff --git a/rust-lib/flowy-user/tests/event/user_update_test.rs b/rust-lib/flowy-user/tests/event/user_profile_test.rs similarity index 71% rename from rust-lib/flowy-user/tests/event/user_update_test.rs rename to rust-lib/flowy-user/tests/event/user_profile_test.rs index 47592a03fe..e90d16634a 100644 --- a/rust-lib/flowy-user/tests/event/user_update_test.rs +++ b/rust-lib/flowy-user/tests/event/user_profile_test.rs @@ -1,11 +1,36 @@ use crate::helper::*; +use flowy_infra::uuid; use flowy_user::{errors::ErrorCode, event::UserEvent::*, prelude::*}; use serial_test::*; +#[test] +#[serial] +fn user_status_get_failed() { + let user_detail = TestBuilder::new() + .event(GetUserProfile) + .assert_error() + .sync_send() + .user_detail; + assert!(user_detail.is_none()) +} + +#[test] +#[serial] +fn user_detail_get() { + let user_detail = TestBuilder::new().sign_up().user_detail; + + let user_detail2 = TestBuilder::new() + .event(GetUserProfile) + .sync_send() + .parse::(); + + assert_eq!(user_detail, user_detail2); +} + #[test] #[serial] fn user_update_with_name() { - let user_detail = TestBuilder::new().login().user_detail.unwrap(); + let user_detail = TestBuilder::new().sign_up().user_detail; let new_name = "hello_world".to_owned(); let request = UpdateUserRequest::new(&user_detail.id).name(&new_name); let _ = TestBuilder::new() @@ -25,8 +50,8 @@ fn user_update_with_name() { #[test] #[serial] fn user_update_with_email() { - let user_detail = TestBuilder::new().login().user_detail.unwrap(); - let new_email = "123@gmai.com".to_owned(); + let user_detail = TestBuilder::new().sign_up().user_detail; + let new_email = format!("{}@gmai.com", uuid()); let request = UpdateUserRequest::new(&user_detail.id).email(&new_email); let _ = TestBuilder::new() @@ -46,7 +71,7 @@ fn user_update_with_email() { #[test] #[serial] fn user_update_with_password() { - let user_detail = TestBuilder::new().login().user_detail.unwrap(); + let user_detail = TestBuilder::new().sign_up().user_detail; let new_password = "H123world!".to_owned(); let request = UpdateUserRequest::new(&user_detail.id).password(&new_password); @@ -60,7 +85,7 @@ fn user_update_with_password() { #[test] #[serial] fn user_update_with_invalid_email() { - let user_detail = TestBuilder::new().login().user_detail.unwrap(); + let user_detail = TestBuilder::new().sign_up().user_detail; for email in invalid_email_test_case() { let request = UpdateUserRequest::new(&user_detail.id).email(&email); assert_eq!( @@ -78,7 +103,7 @@ fn user_update_with_invalid_email() { #[test] #[serial] fn user_update_with_invalid_password() { - let user_detail = TestBuilder::new().login().user_detail.unwrap(); + let user_detail = TestBuilder::new().sign_up().user_detail; for password in invalid_password_test_case() { let request = UpdateUserRequest::new(&user_detail.id).password(&password); @@ -93,7 +118,7 @@ fn user_update_with_invalid_password() { #[test] #[serial] fn user_update_with_invalid_name() { - let user_detail = TestBuilder::new().login().user_detail.unwrap(); + let user_detail = TestBuilder::new().sign_up().user_detail; let request = UpdateUserRequest::new(&user_detail.id).name(""); TestBuilder::new()