AppFlowy/backend/tests/api/helper.rs

175 lines
5.7 KiB
Rust
Raw Normal View History

use backend::{
application::{get_connection_pool, Application},
config::{get_configuration, DatabaseSettings},
};
2021-08-26 02:19:50 +00:00
2021-09-01 08:08:32 +00:00
use flowy_user::{errors::UserError, prelude::*};
2021-08-24 13:38:53 +00:00
use flowy_workspace::prelude::*;
use sqlx::{Connection, Executor, PgConnection, PgPool};
use uuid::Uuid;
pub struct TestApp {
pub address: String,
pub port: u16,
pub pg_pool: PgPool,
}
impl TestApp {
pub async fn register_user(&self, params: SignUpParams) -> SignUpResponse {
let url = format!("{}/api/register", self.address);
let resp = user_sign_up(params, &url).await.unwrap();
resp
}
2021-09-01 08:08:32 +00:00
pub async fn sign_in(&self, params: SignInParams) -> Result<SignInResponse, UserError> {
let url = format!("{}/api/auth", self.address);
2021-09-01 08:08:32 +00:00
user_sign_in(params, &url).await
}
2021-08-24 13:38:53 +00:00
2021-08-31 15:01:46 +00:00
pub async fn sign_out(&self, params: UserToken) {
2021-08-31 09:25:08 +00:00
let url = format!("{}/api/auth", self.address);
let _ = user_sign_out(params, &url).await.unwrap();
}
2021-09-01 08:08:32 +00:00
pub async fn get_user_detail(&self, token: &str) -> UserDetail {
let url = format!("{}/api/user", self.address);
let user_detail = get_user_detail(token, &url).await.unwrap();
2021-08-31 09:56:38 +00:00
user_detail
}
2021-09-01 08:08:32 +00:00
pub async fn update_user_detail(
&self,
token: &str,
params: UpdateUserParams,
) -> Result<(), UserError> {
let url = format!("{}/api/user", self.address);
update_user_detail(token, params, &url).await
}
2021-08-25 09:34:20 +00:00
pub async fn create_workspace(&self, params: CreateWorkspaceParams) -> Workspace {
2021-08-24 13:38:53 +00:00
let url = format!("{}/api/workspace", self.address);
let workspace = create_workspace_request(params, &url).await.unwrap();
workspace
}
2021-08-31 09:25:08 +00:00
pub async fn read_workspaces(&self, params: QueryWorkspaceParams) -> RepeatedWorkspace {
2021-08-24 13:38:53 +00:00
let url = format!("{}/api/workspace", self.address);
2021-08-27 15:53:53 +00:00
let workspaces = read_workspaces_request(params, &url).await.unwrap();
workspaces
2021-08-24 13:38:53 +00:00
}
2021-08-25 09:34:20 +00:00
pub async fn update_workspace(&self, params: UpdateWorkspaceParams) {
let url = format!("{}/api/workspace", self.address);
update_workspace_request(params, &url).await.unwrap();
}
pub async fn delete_workspace(&self, params: DeleteWorkspaceParams) {
let url = format!("{}/api/workspace", self.address);
delete_workspace_request(params, &url).await.unwrap();
}
pub async fn create_app(&self, params: CreateAppParams) -> App {
let url = format!("{}/api/app", self.address);
let app = create_app_request(params, &url).await.unwrap();
app
}
pub async fn read_app(&self, params: QueryAppParams) -> Option<App> {
let url = format!("{}/api/app", self.address);
let app = read_app_request(params, &url).await.unwrap();
app
}
pub async fn update_app(&self, params: UpdateAppParams) {
let url = format!("{}/api/app", self.address);
update_app_request(params, &url).await.unwrap();
}
pub async fn delete_app(&self, params: DeleteAppParams) {
let url = format!("{}/api/app", self.address);
delete_app_request(params, &url).await.unwrap();
}
2021-08-25 13:33:29 +00:00
pub async fn create_view(&self, params: CreateViewParams) -> View {
let url = format!("{}/api/view", self.address);
let view = create_view_request(params, &url).await.unwrap();
view
}
pub async fn read_view(&self, params: QueryViewParams) -> Option<View> {
let url = format!("{}/api/view", self.address);
let view = read_view_request(params, &url).await.unwrap();
view
}
pub async fn update_view(&self, params: UpdateViewParams) {
let url = format!("{}/api/view", self.address);
update_view_request(params, &url).await.unwrap();
}
pub async fn delete_view(&self, params: DeleteViewParams) {
let url = format!("{}/api/view", self.address);
delete_view_request(params, &url).await.unwrap();
}
2021-08-25 09:34:20 +00:00
pub(crate) async fn register_test_user(&self) -> SignUpResponse {
2021-08-24 13:38:53 +00:00
let params = SignUpParams {
email: "annie@appflowy.io".to_string(),
name: "annie".to_string(),
password: "HelloAppFlowy123!".to_string(),
};
let response = self.register_user(params).await;
response
}
}
pub async fn spawn_app() -> TestApp {
let configuration = {
let mut c = get_configuration().expect("Failed to read configuration.");
c.database.database_name = Uuid::new_v4().to_string();
// Use a random OS port
c.application.port = 0;
c
};
let _ = configure_database(&configuration.database).await;
let application = Application::build(configuration.clone())
.await
.expect("Failed to build application.");
let application_port = application.port();
let _ = tokio::spawn(application.run_until_stopped());
TestApp {
address: format!("http://localhost:{}", application_port),
port: application_port,
pg_pool: get_connection_pool(&configuration.database)
.await
.expect("Failed to connect to the database"),
}
}
async fn configure_database(config: &DatabaseSettings) -> PgPool {
// Create database
let mut connection = PgConnection::connect_with(&config.without_db())
.await
.expect("Failed to connect to Postgres");
connection
.execute(&*format!(r#"CREATE DATABASE "{}";"#, config.database_name))
.await
.expect("Failed to create database.");
// Migrate database
let connection_pool = PgPool::connect_with(config.with_db())
.await
.expect("Failed to connect to Postgres.");
sqlx::migrate!("./migrations")
.run(&connection_pool)
.await
.expect("Failed to migrate the database");
connection_pool
}