chore(database): update tests

This commit is contained in:
MedzikUser 2022-06-18 13:39:15 +02:00
parent f9b46c34db
commit c21d9c2ff4
No known key found for this signature in database
GPG Key ID: A5FAC1E185C112DB
4 changed files with 77 additions and 30 deletions

1
Cargo.lock generated
View File

@ -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",

View File

@ -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"] }

View File

@ -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();

View File

@ -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)?;