chore: update database config & fix test

This commit is contained in:
appflowy 2023-03-12 20:58:40 +08:00
parent 2429a41b2f
commit 8af290ab80
10 changed files with 59 additions and 19 deletions

2
.env
View File

@ -1 +1 @@
DATABASE_URL="postgres://postgres:password@localhost:5433/flowy" DATABASE_URL="postgres://postgres:password@localhost:5433/appflowy_pg"

View File

@ -5,6 +5,6 @@ export POSTGRES_USER=postgres
export POSTGRES_PASSWORD=password export POSTGRES_PASSWORD=password
export POSTGRES_PORT=5432 export POSTGRES_PORT=5432
export POSTGRES_HOST=db export POSTGRES_HOST=db
export POSTGRES_DB=flowy export POSTGRES_DB=appflowy_pg
export DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} export DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}

View File

@ -22,7 +22,7 @@ DB_USER="${POSTGRES_USER:=postgres}"
DB_PASSWORD="${POSTGRES_PASSWORD:=password}" DB_PASSWORD="${POSTGRES_PASSWORD:=password}"
DB_PORT="${POSTGRES_PORT:=5432}" DB_PORT="${POSTGRES_PORT:=5432}"
DB_HOST="${POSTGRES_HOST:=localhost}" DB_HOST="${POSTGRES_HOST:=localhost}"
DB_NAME="${POSTGRES_DB:=flowy}" DB_NAME="${POSTGRES_DB:=appflowy_pg}"
if [[ -z "${SKIP_DOCKER}" ]] if [[ -z "${SKIP_DOCKER}" ]]
then then
@ -39,7 +39,7 @@ then
-e POSTGRES_DB="${DB_NAME}" \ -e POSTGRES_DB="${DB_NAME}" \
-p "${DB_PORT}":5432 \ -p "${DB_PORT}":5432 \
-d \ -d \
--name "flowy_postgres_$(date '+%s')" \ --name "af_postgres_$(date '+%s')" \
postgres -N 1000 postgres -N 1000
fi fi

View File

@ -6,4 +6,4 @@ database:
port: 5433 port: 5433
username: "postgres" username: "postgres"
password: "password" password: "password"
database_name: "flowy" database_name: "appflowy_pg"

View File

@ -18,7 +18,7 @@ pub enum AuthError {
Unauthorized, Unauthorized,
#[error("User internal error")] #[error("User internal error")]
InternalError(#[source] anyhow::Error), InternalError(#[from] anyhow::Error),
#[error("Parser uuid failed: {}", err)] #[error("Parser uuid failed: {}", err)]
InvalidUuid { err: String }, InvalidUuid { err: String },

View File

@ -29,16 +29,16 @@ pub async fn login(
password: Secret::new(password), password: Secret::new(password),
}; };
match validate_credentials(credentials, &pg_pool).await? { match validate_credentials(credentials, &pg_pool).await {
Ok(uid) => { Ok(uid) => {
let uid = uid.to_string(); let uid = uid.to_string();
let token = Token::create_token(&uid)?.into(); let token = Token::create_token(&uid)?.into();
let logged_user = LoggedUser::new(uid); let logged_user = LoggedUser::new(uid.clone());
cache.write().await.authorized(logged_user); cache.write().await.authorized(logged_user);
Ok(LoginResponse { Ok(LoginResponse {
token, token,
user_id: uid, uid,
}) })
} }
Err(err) => Err(err), Err(err) => Err(err),
@ -120,13 +120,12 @@ async fn is_email_exist(
pub struct LoginRequest { pub struct LoginRequest {
pub email: String, pub email: String,
pub password: String, pub password: String,
pub name: String,
} }
#[derive(Default, Serialize, Deserialize, Debug)] #[derive(Default, Serialize, Deserialize, Debug)]
pub struct LoginResponse { pub struct LoginResponse {
pub token: String, pub token: String,
pub user_id: String, pub uid: String,
} }
#[derive(Default, Serialize, Deserialize, Debug)] #[derive(Default, Serialize, Deserialize, Debug)]

17
tests/api/login.rs Normal file
View File

@ -0,0 +1,17 @@
use actix_web::http::StatusCode;
use appflowy_server::component::auth::LoginResponse;
use crate::test_server::{spawn_server, TestUser};
#[tokio::test]
async fn login_success() {
let server = spawn_server().await;
let test_user = TestUser::generate();
test_user.register(&server).await;
let http_resp = server.login(&test_user.email, &test_user.password).await;
assert_eq!(http_resp.status(), StatusCode::OK);
let bytes = http_resp.bytes().await.unwrap();
let response: LoginResponse = serde_json::from_slice(&bytes).unwrap();
assert!(!response.token.is_empty())
}

View File

@ -1,2 +1,3 @@
mod login;
mod register; mod register;
mod test_server; mod test_server;

View File

@ -1,5 +1,5 @@
use crate::test_server::spawn_server; use crate::test_server::{error_msg_from_resp, spawn_server};
use appflowy_server::component::auth::RegisterResponse; use appflowy_server::component::auth::{InputParamsError, RegisterResponse};
use reqwest::StatusCode; use reqwest::StatusCode;
#[tokio::test] #[tokio::test]
@ -12,7 +12,6 @@ async fn register_success() {
let bytes = http_resp.bytes().await.unwrap(); let bytes = http_resp.bytes().await.unwrap();
let response: RegisterResponse = serde_json::from_slice(&bytes).unwrap(); let response: RegisterResponse = serde_json::from_slice(&bytes).unwrap();
println!("{:?}", response); println!("{:?}", response);
} }
@ -21,22 +20,27 @@ async fn register_with_invalid_password() {
let server = spawn_server().await; let server = spawn_server().await;
let http_resp = server.register("user 1", "fake@appflowy.io", "123").await; let http_resp = server.register("user 1", "fake@appflowy.io", "123").await;
assert_eq!(http_resp.status(), StatusCode::BAD_REQUEST); assert_eq!(http_resp.status(), StatusCode::BAD_REQUEST);
assert_eq!(error_msg_from_resp(http_resp).await, InputParamsError::InvalidPassword.to_string());
} }
#[tokio::test] #[tokio::test]
async fn register_with_invalid_name() { async fn register_with_invalid_name() {
let server = spawn_server().await; let server = spawn_server().await;
let name = "".to_string();
let http_resp = server let http_resp = server
.register("", "fake@appflowy.io", "FakePassword!123") .register(&name, "fake@appflowy.io", "FakePassword!123")
.await; .await;
assert_eq!(http_resp.status(), StatusCode::BAD_REQUEST); assert_eq!(http_resp.status(), StatusCode::BAD_REQUEST);
assert_eq!(error_msg_from_resp(http_resp).await, InputParamsError::InvalidName(name).to_string());
} }
#[tokio::test] #[tokio::test]
async fn register_with_invalid_email() { async fn register_with_invalid_email() {
let server = spawn_server().await; let server = spawn_server().await;
let email = "appflowy.io".to_string();
let http_resp = server let http_resp = server
.register("me", "appflowy.io", "FakePassword!123") .register("me", &email, "FakePassword!123")
.await; .await;
assert_eq!(http_resp.status(), StatusCode::BAD_REQUEST); assert_eq!(http_resp.status(), StatusCode::BAD_REQUEST);
assert_eq!(error_msg_from_resp(http_resp).await, InputParamsError::InvalidEmail(email).to_string());
} }

View File

@ -40,7 +40,21 @@ impl TestServer {
.json(&payload) .json(&payload)
.send() .send()
.await .await
.expect("Fail to register user") .expect("Register failed")
}
pub async fn login(&self, email: &str, password: &str) -> reqwest::Response {
let payload = serde_json::json!({
"password": password,
"email": email
});
let url = format!("{}/api/user/login", self.address);
self.api_client
.post(&url)
.json(&payload)
.send()
.await
.expect("Login failed")
} }
} }
@ -116,7 +130,7 @@ impl TestUser {
Self { Self {
name: "Me".to_string(), name: "Me".to_string(),
email: "me@appflowy.io".to_string(), email: "me@appflowy.io".to_string(),
password: "HelloAppFlowy123".to_string(), password: "Hello@AppFlowy123".to_string(),
} }
} }
@ -125,9 +139,14 @@ impl TestUser {
test_server test_server
.api_client .api_client
.post(&url) .post(&url)
.json(&self) .json(self)
.send() .send()
.await .await
.expect("Fail to register user"); .expect("Fail to register user");
} }
} }
pub async fn error_msg_from_resp(resp: reqwest::Response) -> String {
let bytes = resp.bytes().await.unwrap();
String::from_utf8(bytes.to_vec()).unwrap()
}