chore(database): update tests
This commit is contained in:
parent
f9b46c34db
commit
c21d9c2ff4
|
@ -667,6 +667,7 @@ dependencies = [
|
||||||
name = "homedisk-database"
|
name = "homedisk-database"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"anyhow",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"homedisk-types",
|
"homedisk-types",
|
||||||
"log",
|
"log",
|
||||||
|
|
|
@ -13,4 +13,5 @@ uuid = { version = "1.1.2", features = ["v5"] }
|
||||||
homedisk-types = { path = "../types", features = ["database"] }
|
homedisk-types = { path = "../types", features = ["database"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
anyhow = "1.0.57"
|
||||||
tokio = { version = "1.19.2", features = ["rt-multi-thread", "macros"] }
|
tokio = { version = "1.19.2", features = ["rt-multi-thread", "macros"] }
|
||||||
|
|
|
@ -13,16 +13,18 @@ pub struct Database {
|
||||||
|
|
||||||
impl Database {
|
impl Database {
|
||||||
/// Open a SQLite database
|
/// Open a SQLite database
|
||||||
/// ```
|
/// ```no_run
|
||||||
/// use homedisk_database::Database;
|
/// use homedisk_database::Database;
|
||||||
///
|
///
|
||||||
/// #[tokio::main]
|
/// #[tokio::main]
|
||||||
/// async fn connect() {
|
/// async fn main() -> anyhow::Result<()> {
|
||||||
/// // open database in memory
|
/// // open database in memory
|
||||||
/// Database::open("sqlite::memory:").await.unwrap();
|
/// Database::open("sqlite::memory:").await?;
|
||||||
///
|
///
|
||||||
/// // open database from file
|
/// // open database from file
|
||||||
/// Database::open("path/to/file.db").await.unwrap();
|
/// Database::open("path/to/database.db").await?;
|
||||||
|
///
|
||||||
|
/// Ok(())
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
pub async fn open(path: &str) -> Result<Self, Error> {
|
pub async fn open(path: &str) -> Result<Self, Error> {
|
||||||
|
@ -36,19 +38,21 @@ impl Database {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a new User
|
/// Create a new User
|
||||||
/// ```
|
/// ```no_run
|
||||||
/// use homedisk_database::{Database, User};
|
/// use homedisk_database::{Database, User};
|
||||||
///
|
///
|
||||||
/// #[tokio::main]
|
/// #[tokio::main]
|
||||||
/// async fn create_user() {
|
/// async fn main() -> anyhow::Result<()> {
|
||||||
/// // open database in memory
|
/// // open database
|
||||||
/// let db = Database::open("sqlite::memory:").await.unwrap();
|
/// let db = Database::open("path/to/database.db").await?;
|
||||||
///
|
///
|
||||||
/// // create `User` type
|
/// // create `User` type
|
||||||
/// let user = User::new("username", "password");
|
/// let user = User::new("username", "password");
|
||||||
///
|
///
|
||||||
/// // create a user in database
|
/// // create a user in database
|
||||||
/// db.create_user(&user).await.unwrap();
|
/// db.create_user(&user).await?;
|
||||||
|
///
|
||||||
|
/// Ok(())
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
pub async fn create_user(&self, user: &User) -> Result<SqliteQueryResult, Error> {
|
pub async fn create_user(&self, user: &User) -> Result<SqliteQueryResult, Error> {
|
||||||
|
@ -69,28 +73,30 @@ impl Database {
|
||||||
/// use homedisk_database::{Database, User};
|
/// use homedisk_database::{Database, User};
|
||||||
///
|
///
|
||||||
/// #[tokio::main]
|
/// #[tokio::main]
|
||||||
/// async fn find_user() {
|
/// async fn find_user() -> anyhow::Result<()> {
|
||||||
/// // open database in memory
|
/// // open database
|
||||||
/// let db = Database::open("sqlite::memory:").await.unwrap();
|
/// let db = Database::open("path/to/database.db").await?;
|
||||||
///
|
///
|
||||||
/// // create `User` type
|
/// // create `User` type
|
||||||
/// let user = User::new("username", "password");
|
/// let user = User::new("username", "password");
|
||||||
///
|
///
|
||||||
/// // create a user in database
|
/// // create a user in database
|
||||||
/// db.create_user(&user).await.unwrap();
|
/// db.create_user(&user).await?;
|
||||||
///
|
///
|
||||||
/// // search for a user
|
/// // search for a user
|
||||||
/// db.find_user(&user.username, &user.password).await.unwrap();
|
/// db.find_user(&user).await?;
|
||||||
|
///
|
||||||
|
/// Ok(())
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
pub async fn find_user(&self, username: &str, password: &str) -> Result<User, Error> {
|
pub async fn find_user(&self, user: &User) -> Result<User, Error> {
|
||||||
debug!("Searching for a user - {}", username);
|
debug!("Searching for a user - {}", user.username);
|
||||||
|
|
||||||
// create query request to database
|
// create query request to database
|
||||||
let query =
|
let query =
|
||||||
sqlx::query_as::<_, User>("SELECT * FROM user WHERE username = ? AND password = ?")
|
sqlx::query_as::<_, User>("SELECT * FROM user WHERE username = ? AND password = ?")
|
||||||
.bind(username)
|
.bind(&user.username)
|
||||||
.bind(password);
|
.bind(&user.password);
|
||||||
|
|
||||||
// fetch query
|
// fetch query
|
||||||
let mut stream = self.conn.fetch(query);
|
let mut stream = self.conn.fetch(query);
|
||||||
|
@ -118,18 +124,20 @@ impl Database {
|
||||||
/// use homedisk_database::{Database, User};
|
/// use homedisk_database::{Database, User};
|
||||||
///
|
///
|
||||||
/// #[tokio::main]
|
/// #[tokio::main]
|
||||||
/// async fn find_user_by_id() {
|
/// async fn find_user_by_id() -> anyhow::Result<()> {
|
||||||
/// // open database in memory
|
/// // open database
|
||||||
/// let db = Database::open("sqlite::memory:").await.unwrap();
|
/// let db = Database::open("path/to/database.db").await?;
|
||||||
///
|
///
|
||||||
/// // create `User` type
|
/// // create `User` type
|
||||||
/// let user = User::new("username", "password");
|
/// let user = User::new("username", "password");
|
||||||
///
|
///
|
||||||
/// // create a user in database
|
/// // create a user in database
|
||||||
/// db.create_user(&user).await.unwrap();
|
/// db.create_user(&user).await?;
|
||||||
///
|
///
|
||||||
/// // search for a user using UUID
|
/// // search for a user using UUID
|
||||||
/// db.find_user_by_id(&user.id).await.unwrap();
|
/// db.find_user_by_id(&user.id).await?;
|
||||||
|
///
|
||||||
|
/// Ok(())
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
pub async fn find_user_by_id(&self, id: &str) -> Result<User, Error> {
|
pub async fn find_user_by_id(&self, id: &str) -> Result<User, Error> {
|
||||||
|
@ -168,6 +176,9 @@ mod tests {
|
||||||
|
|
||||||
use crate::{Database, User};
|
use crate::{Database, User};
|
||||||
|
|
||||||
|
const USERNAME: &str = "medzik";
|
||||||
|
const PASSWORD: &str = "SuperSecretPassword123!";
|
||||||
|
|
||||||
/// Utils to open database in tests
|
/// Utils to open database in tests
|
||||||
async fn open_db() -> Database {
|
async fn open_db() -> Database {
|
||||||
Database::open("sqlite::memory:").await.expect("open db")
|
Database::open("sqlite::memory:").await.expect("open db")
|
||||||
|
@ -184,10 +195,44 @@ mod tests {
|
||||||
.expect("create tables");
|
.expect("create tables");
|
||||||
|
|
||||||
// create new user
|
// create new user
|
||||||
let user = User::new("medzik", "Qwerty1234!");
|
let user = User::new(USERNAME, PASSWORD);
|
||||||
db.create_user(&user).await.expect("create user");
|
db.create_user(&user).await.expect("create user");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Test a create user
|
||||||
|
#[tokio::test]
|
||||||
|
async fn create_user() {
|
||||||
|
let db = open_db().await;
|
||||||
|
new_user(&db).await;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test a search for a user
|
||||||
|
#[tokio::test]
|
||||||
|
async fn find_user() {
|
||||||
|
let db = open_db().await;
|
||||||
|
|
||||||
|
new_user(&db).await;
|
||||||
|
|
||||||
|
let user = User::new(USERNAME, PASSWORD);
|
||||||
|
|
||||||
|
let user = db.find_user(&user).await.unwrap();
|
||||||
|
|
||||||
|
assert_eq!(user.username, USERNAME)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test a search for a user by id
|
||||||
|
#[tokio::test]
|
||||||
|
async fn find_user_by_id() {
|
||||||
|
let db = open_db().await;
|
||||||
|
new_user(&db).await;
|
||||||
|
|
||||||
|
let user = User::new(USERNAME, PASSWORD);
|
||||||
|
|
||||||
|
let user = db.find_user_by_id(&user.id).await.unwrap();
|
||||||
|
|
||||||
|
assert_eq!(user.username, USERNAME)
|
||||||
|
}
|
||||||
|
|
||||||
/// Test a search for a user with an invalid password to see if the user is returned (it shouldn't be)
|
/// Test a search for a user with an invalid password to see if the user is returned (it shouldn't be)
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn find_user_wrong_password() {
|
async fn find_user_wrong_password() {
|
||||||
|
@ -195,10 +240,10 @@ mod tests {
|
||||||
|
|
||||||
new_user(&db).await;
|
new_user(&db).await;
|
||||||
|
|
||||||
let user = User::new("medzik", "wrong password 123!");
|
let user = User::new(USERNAME, "wrong password 123!");
|
||||||
|
|
||||||
let err = db
|
let err = db
|
||||||
.find_user(&user.username, &user.password)
|
.find_user(&user)
|
||||||
.await
|
.await
|
||||||
.unwrap_err();
|
.unwrap_err();
|
||||||
|
|
||||||
|
@ -212,10 +257,10 @@ mod tests {
|
||||||
|
|
||||||
new_user(&db).await;
|
new_user(&db).await;
|
||||||
|
|
||||||
let user = User::new("not_exists_user", "secret password of a not existing user");
|
let user = User::new("not_exists_user", PASSWORD);
|
||||||
|
|
||||||
let err = db
|
let err = db
|
||||||
.find_user(&user.username, &user.password)
|
.find_user(&user)
|
||||||
.await
|
.await
|
||||||
.unwrap_err();
|
.unwrap_err();
|
||||||
|
|
||||||
|
@ -229,7 +274,7 @@ mod tests {
|
||||||
|
|
||||||
new_user(&db).await;
|
new_user(&db).await;
|
||||||
|
|
||||||
let other_user = User::new("other_user", "my secret passphrase");
|
let other_user = User::new("not_exists_user", "my secret passphrase");
|
||||||
|
|
||||||
let err = db.find_user_by_id(&other_user.id).await.unwrap_err();
|
let err = db.find_user_by_id(&other_user.id).await.unwrap_err();
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ pub async fn handle(
|
||||||
let user = User::new(&request.username, &request.password);
|
let user = User::new(&request.username, &request.password);
|
||||||
|
|
||||||
// search for a user in database
|
// search for a user in database
|
||||||
let response = match db.find_user(&user.username, &user.password).await {
|
let response = match db.find_user(&user).await {
|
||||||
Ok(user) => {
|
Ok(user) => {
|
||||||
// create user token
|
// create user token
|
||||||
let token = create_token(&user, config.jwt.secret.as_bytes(), config.jwt.expires)?;
|
let token = create_token(&user, config.jwt.secret.as_bytes(), config.jwt.expires)?;
|
||||||
|
|
Loading…
Reference in New Issue