workspace.rs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. use crate::prelude::*;
  2. use flowy_document_infra::entities::doc::Doc;
  3. use flowy_workspace::{
  4. entities::{
  5. app::*,
  6. trash::{RepeatedTrash, TrashIdentifier},
  7. view::*,
  8. workspace::*,
  9. },
  10. errors::ErrorCode,
  11. event::WorkspaceEvent::*,
  12. };
  13. pub struct WorkspaceTest {
  14. pub sdk: FlowyTestSDK,
  15. pub workspace: Workspace,
  16. }
  17. impl WorkspaceTest {
  18. pub async fn new() -> Self {
  19. let test = FlowyTest::setup();
  20. let _ = test.init_user().await;
  21. let workspace = create_workspace(&test.sdk, "Workspace", "").await;
  22. open_workspace(&test.sdk, &workspace.id).await;
  23. Self {
  24. sdk: test.sdk,
  25. workspace,
  26. }
  27. }
  28. }
  29. pub struct AppTest {
  30. pub sdk: FlowyTestSDK,
  31. pub workspace: Workspace,
  32. pub app: App,
  33. }
  34. impl AppTest {
  35. pub async fn new() -> Self {
  36. let test = FlowyTest::setup();
  37. let _ = test.init_user().await;
  38. let workspace = create_workspace(&test.sdk, "Workspace", "").await;
  39. open_workspace(&test.sdk, &workspace.id).await;
  40. let app = create_app(&test.sdk, "App", "AppFlowy Github Project", &workspace.id).await;
  41. Self {
  42. sdk: test.sdk,
  43. workspace,
  44. app,
  45. }
  46. }
  47. pub async fn move_app_to_trash(&self) {
  48. let request = UpdateAppRequest {
  49. app_id: self.app.id.clone(),
  50. name: None,
  51. desc: None,
  52. color_style: None,
  53. is_trash: Some(true),
  54. };
  55. update_app(&self.sdk, request).await;
  56. }
  57. }
  58. pub struct ViewTest {
  59. pub sdk: FlowyTestSDK,
  60. pub workspace: Workspace,
  61. pub app: App,
  62. pub view: View,
  63. }
  64. impl ViewTest {
  65. pub async fn new(test: &FlowyTest) -> Self {
  66. let workspace = create_workspace(&test.sdk, "Workspace", "").await;
  67. open_workspace(&test.sdk, &workspace.id).await;
  68. let app = create_app(&test.sdk, "App", "AppFlowy Github Project", &workspace.id).await;
  69. let view = create_view(&test.sdk, &app.id).await;
  70. Self {
  71. sdk: test.sdk.clone(),
  72. workspace,
  73. app,
  74. view,
  75. }
  76. }
  77. pub async fn delete_views(&self, view_ids: Vec<String>) {
  78. let request = QueryViewRequest { view_ids };
  79. delete_view(&self.sdk, request).await;
  80. }
  81. pub async fn delete_views_permanent(&self, view_ids: Vec<String>) {
  82. let request = QueryViewRequest { view_ids };
  83. delete_view(&self.sdk, request).await;
  84. FlowyWorkspaceTest::new(self.sdk.clone())
  85. .event(DeleteAll)
  86. .async_send()
  87. .await;
  88. }
  89. }
  90. pub fn invalid_workspace_name_test_case() -> Vec<(String, ErrorCode)> {
  91. vec![
  92. ("".to_owned(), ErrorCode::WorkspaceNameInvalid),
  93. ("1234".repeat(100), ErrorCode::WorkspaceNameTooLong),
  94. ]
  95. }
  96. pub async fn create_workspace(sdk: &FlowyTestSDK, name: &str, desc: &str) -> Workspace {
  97. let request = CreateWorkspaceRequest {
  98. name: name.to_owned(),
  99. desc: desc.to_owned(),
  100. };
  101. let workspace = FlowyWorkspaceTest::new(sdk.clone())
  102. .event(CreateWorkspace)
  103. .request(request)
  104. .async_send()
  105. .await
  106. .parse::<Workspace>();
  107. workspace
  108. }
  109. async fn open_workspace(sdk: &FlowyTestSDK, workspace_id: &str) {
  110. let request = QueryWorkspaceRequest {
  111. workspace_id: Some(workspace_id.to_owned()),
  112. };
  113. let _ = FlowyWorkspaceTest::new(sdk.clone())
  114. .event(OpenWorkspace)
  115. .request(request)
  116. .async_send()
  117. .await;
  118. }
  119. pub async fn read_workspace(sdk: &FlowyTestSDK, request: QueryWorkspaceRequest) -> Vec<Workspace> {
  120. let mut repeated_workspace = FlowyWorkspaceTest::new(sdk.clone())
  121. .event(ReadWorkspaces)
  122. .request(request.clone())
  123. .async_send()
  124. .await
  125. .parse::<RepeatedWorkspace>();
  126. let workspaces;
  127. if let Some(workspace_id) = &request.workspace_id {
  128. workspaces = repeated_workspace
  129. .into_inner()
  130. .into_iter()
  131. .filter(|workspace| &workspace.id == workspace_id)
  132. .collect::<Vec<Workspace>>();
  133. debug_assert_eq!(workspaces.len(), 1);
  134. } else {
  135. workspaces = repeated_workspace.items;
  136. }
  137. workspaces
  138. }
  139. pub async fn create_app(sdk: &FlowyTestSDK, name: &str, desc: &str, workspace_id: &str) -> App {
  140. let create_app_request = CreateAppRequest {
  141. workspace_id: workspace_id.to_owned(),
  142. name: name.to_string(),
  143. desc: desc.to_string(),
  144. color_style: Default::default(),
  145. };
  146. let app = FlowyWorkspaceTest::new(sdk.clone())
  147. .event(CreateApp)
  148. .request(create_app_request)
  149. .async_send()
  150. .await
  151. .parse::<App>();
  152. app
  153. }
  154. pub async fn delete_app(sdk: &FlowyTestSDK, app_id: &str) {
  155. let delete_app_request = AppIdentifier {
  156. app_id: app_id.to_string(),
  157. };
  158. FlowyWorkspaceTest::new(sdk.clone())
  159. .event(DeleteApp)
  160. .request(delete_app_request)
  161. .async_send()
  162. .await;
  163. }
  164. pub async fn update_app(sdk: &FlowyTestSDK, request: UpdateAppRequest) {
  165. FlowyWorkspaceTest::new(sdk.clone())
  166. .event(UpdateApp)
  167. .request(request)
  168. .async_send()
  169. .await;
  170. }
  171. pub async fn read_app(sdk: &FlowyTestSDK, request: QueryAppRequest) -> App {
  172. let app = FlowyWorkspaceTest::new(sdk.clone())
  173. .event(ReadApp)
  174. .request(request)
  175. .async_send()
  176. .await
  177. .parse::<App>();
  178. app
  179. }
  180. pub async fn create_view_with_request(sdk: &FlowyTestSDK, request: CreateViewRequest) -> View {
  181. let view = FlowyWorkspaceTest::new(sdk.clone())
  182. .event(CreateView)
  183. .request(request)
  184. .async_send()
  185. .await
  186. .parse::<View>();
  187. view
  188. }
  189. pub async fn create_view(sdk: &FlowyTestSDK, app_id: &str) -> View {
  190. let request = CreateViewRequest {
  191. belong_to_id: app_id.to_string(),
  192. name: "View A".to_string(),
  193. desc: "".to_string(),
  194. thumbnail: Some("http://1.png".to_string()),
  195. view_type: ViewType::Doc,
  196. };
  197. create_view_with_request(sdk, request).await
  198. }
  199. pub async fn update_view(sdk: &FlowyTestSDK, request: UpdateViewRequest) {
  200. FlowyWorkspaceTest::new(sdk.clone())
  201. .event(UpdateView)
  202. .request(request)
  203. .async_send()
  204. .await;
  205. }
  206. pub async fn read_view(sdk: &FlowyTestSDK, request: QueryViewRequest) -> View {
  207. FlowyWorkspaceTest::new(sdk.clone())
  208. .event(ReadView)
  209. .request(request)
  210. .async_send()
  211. .await
  212. .parse::<View>()
  213. }
  214. pub async fn delete_view(sdk: &FlowyTestSDK, request: QueryViewRequest) {
  215. FlowyWorkspaceTest::new(sdk.clone())
  216. .event(DeleteView)
  217. .request(request)
  218. .async_send()
  219. .await;
  220. }
  221. pub async fn read_trash(sdk: &FlowyTestSDK) -> RepeatedTrash {
  222. FlowyWorkspaceTest::new(sdk.clone())
  223. .event(ReadTrash)
  224. .async_send()
  225. .await
  226. .parse::<RepeatedTrash>()
  227. }
  228. pub async fn putback_trash(sdk: &FlowyTestSDK, id: TrashIdentifier) {
  229. FlowyWorkspaceTest::new(sdk.clone())
  230. .event(PutbackTrash)
  231. .request(id)
  232. .async_send()
  233. .await;
  234. }
  235. pub async fn open_view(sdk: &FlowyTestSDK, request: QueryViewRequest) -> Doc {
  236. FlowyWorkspaceTest::new(sdk.clone())
  237. .event(OpenView)
  238. .request(request)
  239. .async_send()
  240. .await
  241. .parse::<Doc>()
  242. }