helper.rs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. use backend::{
  2. application::{get_connection_pool, Application},
  3. config::{get_configuration, DatabaseSettings},
  4. };
  5. use flowy_net::request::HttpRequestBuilder;
  6. use flowy_user::prelude::*;
  7. use flowy_workspace::prelude::*;
  8. use sqlx::{Connection, Executor, PgConnection, PgPool};
  9. use uuid::Uuid;
  10. pub struct TestApp {
  11. pub address: String,
  12. pub port: u16,
  13. pub pg_pool: PgPool,
  14. }
  15. impl TestApp {
  16. pub async fn register_user(&self, params: SignUpParams) -> SignUpResponse {
  17. let url = format!("{}/api/register", self.address);
  18. let resp = user_sign_up(params, &url).await.unwrap();
  19. resp
  20. }
  21. pub async fn sign_in(&self, params: SignInParams) -> SignInResponse {
  22. let url = format!("{}/api/auth", self.address);
  23. let resp = user_sign_in(params, &url).await.unwrap();
  24. resp
  25. }
  26. pub async fn create_workspace(&self, params: CreateWorkspaceParams) -> Workspace {
  27. let url = format!("{}/api/workspace", self.address);
  28. let workspace = create_workspace_request(params, &url).await.unwrap();
  29. workspace
  30. }
  31. pub async fn read_workspace(&self, params: QueryWorkspaceParams) -> Option<Workspace> {
  32. let url = format!("{}/api/workspace", self.address);
  33. let workspace = read_workspace_request(params, &url).await.unwrap();
  34. workspace
  35. }
  36. pub async fn update_workspace(&self, params: UpdateWorkspaceParams) {
  37. let url = format!("{}/api/workspace", self.address);
  38. update_workspace_request(params, &url).await.unwrap();
  39. }
  40. pub async fn delete_workspace(&self, params: DeleteWorkspaceParams) {
  41. let url = format!("{}/api/workspace", self.address);
  42. delete_workspace_request(params, &url).await.unwrap();
  43. }
  44. pub async fn create_app(&self, params: CreateAppParams) -> App {
  45. let url = format!("{}/api/app", self.address);
  46. let app = create_app_request(params, &url).await.unwrap();
  47. app
  48. }
  49. pub async fn read_app(&self, params: QueryAppParams) -> Option<App> {
  50. let url = format!("{}/api/app", self.address);
  51. let app = read_app_request(params, &url).await.unwrap();
  52. app
  53. }
  54. pub async fn update_app(&self, params: UpdateAppParams) {
  55. let url = format!("{}/api/app", self.address);
  56. update_app_request(params, &url).await.unwrap();
  57. }
  58. pub async fn delete_app(&self, params: DeleteAppParams) {
  59. let url = format!("{}/api/app", self.address);
  60. delete_app_request(params, &url).await.unwrap();
  61. }
  62. pub(crate) async fn register_test_user(&self) -> SignUpResponse {
  63. let params = SignUpParams {
  64. email: "[email protected]".to_string(),
  65. name: "annie".to_string(),
  66. password: "HelloAppFlowy123!".to_string(),
  67. };
  68. let response = self.register_user(params).await;
  69. response
  70. }
  71. }
  72. pub async fn spawn_app() -> TestApp {
  73. let configuration = {
  74. let mut c = get_configuration().expect("Failed to read configuration.");
  75. c.database.database_name = Uuid::new_v4().to_string();
  76. // Use a random OS port
  77. c.application.port = 0;
  78. c
  79. };
  80. let _ = configure_database(&configuration.database).await;
  81. let application = Application::build(configuration.clone())
  82. .await
  83. .expect("Failed to build application.");
  84. let application_port = application.port();
  85. let _ = tokio::spawn(application.run_until_stopped());
  86. TestApp {
  87. address: format!("http://localhost:{}", application_port),
  88. port: application_port,
  89. pg_pool: get_connection_pool(&configuration.database)
  90. .await
  91. .expect("Failed to connect to the database"),
  92. }
  93. }
  94. async fn configure_database(config: &DatabaseSettings) -> PgPool {
  95. // Create database
  96. let mut connection = PgConnection::connect_with(&config.without_db())
  97. .await
  98. .expect("Failed to connect to Postgres");
  99. connection
  100. .execute(&*format!(r#"CREATE DATABASE "{}";"#, config.database_name))
  101. .await
  102. .expect("Failed to create database.");
  103. // Migrate database
  104. let connection_pool = PgPool::connect_with(config.with_db())
  105. .await
  106. .expect("Failed to connect to Postgres.");
  107. sqlx::migrate!("./migrations")
  108. .run(&connection_pool)
  109. .await
  110. .expect("Failed to migrate the database");
  111. connection_pool
  112. }