helper.rs 5.3 KB

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