helper.rs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. use crate::prelude::*;
  2. use flowy_folder::entities::WorkspaceIdPB;
  3. use flowy_folder::{
  4. entities::{
  5. app::*,
  6. view::*,
  7. workspace::{CreateWorkspacePayloadPB, WorkspacePB},
  8. },
  9. event_map::FolderEvent::{CreateWorkspace, OpenWorkspace, *},
  10. };
  11. use flowy_user::{
  12. entities::{SignInPayloadPB, SignUpPayloadPB, UserProfilePB},
  13. errors::FlowyError,
  14. event_map::UserEvent::{InitUser, SignIn, SignOut, SignUp},
  15. };
  16. use lib_dispatch::prelude::{AFPluginDispatcher, AFPluginRequest, ToBytes};
  17. use std::{fs, path::PathBuf, sync::Arc};
  18. pub struct ViewTest {
  19. pub sdk: FlowySDKTest,
  20. pub workspace: WorkspacePB,
  21. pub app: AppPB,
  22. pub view: ViewPB,
  23. }
  24. impl ViewTest {
  25. #[allow(dead_code)]
  26. pub async fn new(sdk: &FlowySDKTest, layout: ViewLayoutTypePB, data: Vec<u8>) -> Self {
  27. let workspace = create_workspace(sdk, "Workspace", "").await;
  28. open_workspace(sdk, &workspace.id).await;
  29. let app = create_app(sdk, "App", "AppFlowy GitHub Project", &workspace.id).await;
  30. let view = create_view(sdk, &app.id, layout, data).await;
  31. Self {
  32. sdk: sdk.clone(),
  33. workspace,
  34. app,
  35. view,
  36. }
  37. }
  38. pub async fn new_grid_view(sdk: &FlowySDKTest, data: Vec<u8>) -> Self {
  39. Self::new(sdk, ViewLayoutTypePB::Grid, data).await
  40. }
  41. pub async fn new_board_view(sdk: &FlowySDKTest, data: Vec<u8>) -> Self {
  42. Self::new(sdk, ViewLayoutTypePB::Board, data).await
  43. }
  44. pub async fn new_calendar_view(sdk: &FlowySDKTest, data: Vec<u8>) -> Self {
  45. Self::new(sdk, ViewLayoutTypePB::Calendar, data).await
  46. }
  47. pub async fn new_document_view(sdk: &FlowySDKTest) -> Self {
  48. Self::new(sdk, ViewLayoutTypePB::Document, vec![]).await
  49. }
  50. }
  51. async fn create_workspace(sdk: &FlowySDKTest, name: &str, desc: &str) -> WorkspacePB {
  52. let request = CreateWorkspacePayloadPB {
  53. name: name.to_owned(),
  54. desc: desc.to_owned(),
  55. };
  56. FolderEventBuilder::new(sdk.clone())
  57. .event(CreateWorkspace)
  58. .payload(request)
  59. .async_send()
  60. .await
  61. .parse::<WorkspacePB>()
  62. }
  63. async fn open_workspace(sdk: &FlowySDKTest, workspace_id: &str) {
  64. let payload = WorkspaceIdPB {
  65. value: Some(workspace_id.to_owned()),
  66. };
  67. let _ = FolderEventBuilder::new(sdk.clone())
  68. .event(OpenWorkspace)
  69. .payload(payload)
  70. .async_send()
  71. .await;
  72. }
  73. async fn create_app(sdk: &FlowySDKTest, name: &str, desc: &str, workspace_id: &str) -> AppPB {
  74. let create_app_request = CreateAppPayloadPB {
  75. workspace_id: workspace_id.to_owned(),
  76. name: name.to_string(),
  77. desc: desc.to_string(),
  78. color_style: Default::default(),
  79. };
  80. FolderEventBuilder::new(sdk.clone())
  81. .event(CreateApp)
  82. .payload(create_app_request)
  83. .async_send()
  84. .await
  85. .parse::<AppPB>()
  86. }
  87. async fn create_view(
  88. sdk: &FlowySDKTest,
  89. app_id: &str,
  90. layout: ViewLayoutTypePB,
  91. data: Vec<u8>,
  92. ) -> ViewPB {
  93. let payload = CreateViewPayloadPB {
  94. belong_to_id: app_id.to_string(),
  95. name: "View A".to_string(),
  96. desc: "".to_string(),
  97. thumbnail: Some("http://1.png".to_string()),
  98. layout,
  99. initial_data: data,
  100. ext: Default::default(),
  101. };
  102. FolderEventBuilder::new(sdk.clone())
  103. .event(CreateView)
  104. .payload(payload)
  105. .async_send()
  106. .await
  107. .parse::<ViewPB>()
  108. }
  109. pub fn root_dir() -> String {
  110. // https://doc.rust-lang.org/cargo/reference/environment-variables.html
  111. let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap_or_else(|_| "./".to_owned());
  112. let mut path_buf = fs::canonicalize(&PathBuf::from(&manifest_dir)).unwrap();
  113. path_buf.pop(); // rust-lib
  114. path_buf.push("temp");
  115. path_buf.push("flowy");
  116. let root_dir = path_buf.to_str().unwrap().to_string();
  117. if !std::path::Path::new(&root_dir).exists() {
  118. std::fs::create_dir_all(&root_dir).unwrap();
  119. }
  120. root_dir
  121. }
  122. pub fn random_email() -> String {
  123. format!("{}@appflowy.io", nanoid!(20))
  124. }
  125. pub fn login_email() -> String {
  126. "[email protected]".to_string()
  127. }
  128. pub fn login_password() -> String {
  129. "HelloWorld!123".to_string()
  130. }
  131. pub struct SignUpContext {
  132. pub user_profile: UserProfilePB,
  133. pub password: String,
  134. }
  135. pub fn sign_up(dispatch: Arc<AFPluginDispatcher>) -> SignUpContext {
  136. let password = login_password();
  137. let payload = SignUpPayloadPB {
  138. email: random_email(),
  139. name: "app flowy".to_string(),
  140. password: password.clone(),
  141. }
  142. .into_bytes()
  143. .unwrap();
  144. let request = AFPluginRequest::new(SignUp).payload(payload);
  145. let user_profile = AFPluginDispatcher::sync_send(dispatch, request)
  146. .parse::<UserProfilePB, FlowyError>()
  147. .unwrap()
  148. .unwrap();
  149. SignUpContext {
  150. user_profile,
  151. password,
  152. }
  153. }
  154. pub async fn async_sign_up(dispatch: Arc<AFPluginDispatcher>) -> SignUpContext {
  155. let password = login_password();
  156. let email = random_email();
  157. let payload = SignUpPayloadPB {
  158. email,
  159. name: "app flowy".to_string(),
  160. password: password.clone(),
  161. }
  162. .into_bytes()
  163. .unwrap();
  164. let request = AFPluginRequest::new(SignUp).payload(payload);
  165. let user_profile = AFPluginDispatcher::async_send(dispatch.clone(), request)
  166. .await
  167. .parse::<UserProfilePB, FlowyError>()
  168. .unwrap()
  169. .unwrap();
  170. // let _ = create_default_workspace_if_need(dispatch.clone(), &user_profile.id);
  171. SignUpContext {
  172. user_profile,
  173. password,
  174. }
  175. }
  176. pub async fn init_user_setting(dispatch: Arc<AFPluginDispatcher>) {
  177. let request = AFPluginRequest::new(InitUser);
  178. let _ = AFPluginDispatcher::async_send(dispatch.clone(), request).await;
  179. }
  180. #[allow(dead_code)]
  181. fn sign_in(dispatch: Arc<AFPluginDispatcher>) -> UserProfilePB {
  182. let payload = SignInPayloadPB {
  183. email: login_email(),
  184. password: login_password(),
  185. name: "rust".to_owned(),
  186. }
  187. .into_bytes()
  188. .unwrap();
  189. let request = AFPluginRequest::new(SignIn).payload(payload);
  190. AFPluginDispatcher::sync_send(dispatch, request)
  191. .parse::<UserProfilePB, FlowyError>()
  192. .unwrap()
  193. .unwrap()
  194. }
  195. #[allow(dead_code)]
  196. fn logout(dispatch: Arc<AFPluginDispatcher>) {
  197. let _ = AFPluginDispatcher::sync_send(dispatch, AFPluginRequest::new(SignOut));
  198. }