helper.rs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. use backend::{
  2. application::{get_connection_pool, Application},
  3. config::{get_configuration, DatabaseSettings},
  4. };
  5. use flowy_user::{errors::UserError, prelude::*};
  6. use flowy_workspace::prelude::*;
  7. use sqlx::{Connection, Executor, PgConnection, PgPool};
  8. use uuid::Uuid;
  9. pub struct TestApp {
  10. pub address: String,
  11. pub port: u16,
  12. pub pg_pool: PgPool,
  13. }
  14. impl TestApp {
  15. pub async fn register_user(&self, params: SignUpParams) -> SignUpResponse {
  16. let url = format!("{}/api/register", self.address);
  17. let resp = user_sign_up(params, &url).await.unwrap();
  18. resp
  19. }
  20. pub async fn sign_in(&self, params: SignInParams) -> Result<SignInResponse, UserError> {
  21. let url = format!("{}/api/auth", self.address);
  22. user_sign_in(params, &url).await
  23. }
  24. pub async fn sign_out(&self, params: UserToken) {
  25. let url = format!("{}/api/auth", self.address);
  26. let _ = user_sign_out(params, &url).await.unwrap();
  27. }
  28. pub async fn get_user_detail(&self, token: &str) -> UserDetail {
  29. let url = format!("{}/api/user", self.address);
  30. let user_detail = get_user_detail(token, &url).await.unwrap();
  31. user_detail
  32. }
  33. pub async fn update_user_detail(
  34. &self,
  35. token: &str,
  36. params: UpdateUserParams,
  37. ) -> Result<(), UserError> {
  38. let url = format!("{}/api/user", self.address);
  39. update_user_detail(token, params, &url).await
  40. }
  41. pub async fn create_workspace(&self, params: CreateWorkspaceParams) -> Workspace {
  42. let url = format!("{}/api/workspace", self.address);
  43. let workspace = create_workspace_request(params, &url).await.unwrap();
  44. workspace
  45. }
  46. pub async fn read_workspaces(&self, params: QueryWorkspaceParams) -> RepeatedWorkspace {
  47. let url = format!("{}/api/workspace", self.address);
  48. let workspaces = read_workspaces_request(params, &url).await.unwrap();
  49. workspaces
  50. }
  51. pub async fn update_workspace(&self, params: UpdateWorkspaceParams) {
  52. let url = format!("{}/api/workspace", self.address);
  53. update_workspace_request(params, &url).await.unwrap();
  54. }
  55. pub async fn delete_workspace(&self, params: DeleteWorkspaceParams) {
  56. let url = format!("{}/api/workspace", self.address);
  57. delete_workspace_request(params, &url).await.unwrap();
  58. }
  59. pub async fn create_app(&self, params: CreateAppParams) -> App {
  60. let url = format!("{}/api/app", self.address);
  61. let app = create_app_request(params, &url).await.unwrap();
  62. app
  63. }
  64. pub async fn read_app(&self, params: QueryAppParams) -> Option<App> {
  65. let url = format!("{}/api/app", self.address);
  66. let app = read_app_request(params, &url).await.unwrap();
  67. app
  68. }
  69. pub async fn update_app(&self, params: UpdateAppParams) {
  70. let url = format!("{}/api/app", self.address);
  71. update_app_request(params, &url).await.unwrap();
  72. }
  73. pub async fn delete_app(&self, params: DeleteAppParams) {
  74. let url = format!("{}/api/app", self.address);
  75. delete_app_request(params, &url).await.unwrap();
  76. }
  77. pub async fn create_view(&self, params: CreateViewParams) -> View {
  78. let url = format!("{}/api/view", self.address);
  79. let view = create_view_request(params, &url).await.unwrap();
  80. view
  81. }
  82. pub async fn read_view(&self, params: QueryViewParams) -> Option<View> {
  83. let url = format!("{}/api/view", self.address);
  84. let view = read_view_request(params, &url).await.unwrap();
  85. view
  86. }
  87. pub async fn update_view(&self, params: UpdateViewParams) {
  88. let url = format!("{}/api/view", self.address);
  89. update_view_request(params, &url).await.unwrap();
  90. }
  91. pub async fn delete_view(&self, params: DeleteViewParams) {
  92. let url = format!("{}/api/view", self.address);
  93. delete_view_request(params, &url).await.unwrap();
  94. }
  95. pub(crate) async fn register_test_user(&self) -> SignUpResponse {
  96. let params = SignUpParams {
  97. email: "[email protected]".to_string(),
  98. name: "annie".to_string(),
  99. password: "HelloAppFlowy123!".to_string(),
  100. };
  101. let response = self.register_user(params).await;
  102. response
  103. }
  104. }
  105. pub async fn spawn_app() -> TestApp {
  106. let configuration = {
  107. let mut c = get_configuration().expect("Failed to read configuration.");
  108. c.database.database_name = Uuid::new_v4().to_string();
  109. // Use a random OS port
  110. c.application.port = 0;
  111. c
  112. };
  113. let _ = configure_database(&configuration.database).await;
  114. let application = Application::build(configuration.clone())
  115. .await
  116. .expect("Failed to build application.");
  117. let application_port = application.port();
  118. let _ = tokio::spawn(application.run_until_stopped());
  119. TestApp {
  120. address: format!("http://localhost:{}", application_port),
  121. port: application_port,
  122. pg_pool: get_connection_pool(&configuration.database)
  123. .await
  124. .expect("Failed to connect to the database"),
  125. }
  126. }
  127. async fn configure_database(config: &DatabaseSettings) -> PgPool {
  128. // Create database
  129. let mut connection = PgConnection::connect_with(&config.without_db())
  130. .await
  131. .expect("Failed to connect to Postgres");
  132. connection
  133. .execute(&*format!(r#"CREATE DATABASE "{}";"#, config.database_name))
  134. .await
  135. .expect("Failed to create database.");
  136. // Migrate database
  137. let connection_pool = PgPool::connect_with(config.with_db())
  138. .await
  139. .expect("Failed to connect to Postgres.");
  140. sqlx::migrate!("./migrations")
  141. .run(&connection_pool)
  142. .await
  143. .expect("Failed to migrate the database");
  144. connection_pool
  145. }