utils (database/crypto): update comments and tests

This commit is contained in:
MedzikUser 2022-04-19 21:08:13 +02:00
parent f02bb0e358
commit 58d99806d4
No known key found for this signature in database
GPG Key ID: A5FAC1E185C112DB
3 changed files with 55 additions and 20 deletions

View File

@ -1,11 +1,9 @@
pub use hex::encode;
use sha1::Sha1; use sha1::Sha1;
use sha2::{Digest, Sha256, Sha512}; use sha2::{Digest, Sha256, Sha512};
use super::{Error, Result}; use super::{Error, Result};
/// create a cryptographic hash from a string (sha1, sha256, sha512) /// create a cryptographic hash from a string (sha1, sha256, sha512)
///
/// ``` /// ```
/// use homedisk_utils::crypto::{CryptographicHash, encode}; /// use homedisk_utils::crypto::{CryptographicHash, encode};
/// ///
@ -24,6 +22,7 @@ pub enum CryptographicHash {
} }
impl CryptographicHash { impl CryptographicHash {
/// Create a new hasher
pub fn new(algo: &str) -> Result<Self> { pub fn new(algo: &str) -> Result<Self> {
match algo { match algo {
"SHA-1" | "SHA1" | "Sha1" | "sha1" => Ok(Self::Sha1(Sha1::new())), "SHA-1" | "SHA1" | "Sha1" | "sha1" => Ok(Self::Sha1(Sha1::new())),
@ -33,6 +32,7 @@ impl CryptographicHash {
} }
} }
/// Set a value for hasher
pub fn update(&mut self, input: &[u8]) { pub fn update(&mut self, input: &[u8]) {
match self { match self {
Self::Sha1(sha1) => sha1.update(input), Self::Sha1(sha1) => sha1.update(input),
@ -41,6 +41,7 @@ impl CryptographicHash {
} }
} }
/// Compute hash
pub fn finalize(&mut self) -> Vec<u8> { pub fn finalize(&mut self) -> Vec<u8> {
match self { match self {
Self::Sha1(sha1) => sha1.finalize_reset().to_vec(), Self::Sha1(sha1) => sha1.finalize_reset().to_vec(),
@ -49,6 +50,7 @@ impl CryptographicHash {
} }
} }
/// Streamline the hash calculation to a single function
pub fn hash(algo: &str, input: &[u8]) -> Result<Vec<u8>> { pub fn hash(algo: &str, input: &[u8]) -> Result<Vec<u8>> {
let mut hasher = Self::new(algo)?; let mut hasher = Self::new(algo)?;
@ -98,6 +100,16 @@ mod tests {
) )
} }
#[test]
fn hash_fn() {
let hash = CryptographicHash::hash("SHA-512", b"test sha512 hash").unwrap();
assert_eq!(
encode(hash),
"b43b4d7178014c92f55be828d66c9f98211fc67b385f7790a5b4b2fcb89fe1831645b5a4c17f3f7f11d8f34d2800a77a2b8faa5a0fb9d6b8f7befbc29a9ce795".to_string()
)
}
#[test] #[test]
fn unknown_algorithm() { fn unknown_algorithm() {
let algo = "unknow_algo"; let algo = "unknow_algo";

View File

@ -1,4 +1,5 @@
mod error; mod error;
mod hash; mod hash;
pub use hex::encode;
pub use {error::*, hash::*}; pub use {error::*, hash::*};

View File

@ -10,13 +10,10 @@ pub struct Database {
impl Database { impl Database {
/// Open SQLite Database file /// Open SQLite Database file
/// ``` /// ```ignore
/// use homedisk_utils::database::Database; /// use homedisk_utils::database::Database;
/// ///
/// #[tokio::main] /// Database::open("sqlite::memory:").await?;
/// async fn main() {
/// Database::open("sqlite::memory:").await.unwrap();
/// }
/// ``` /// ```
pub async fn open(path: &str) -> Result<Self, Error> { pub async fn open(path: &str) -> Result<Self, Error> {
debug!("opening SQLite database"); debug!("opening SQLite database");
@ -27,21 +24,11 @@ impl Database {
} }
/// Create new User /// Create new User
/// ``` /// ```ignore
/// use std::fs;
///
/// use sqlx::Executor;
/// use homedisk_utils::database::{Database, User}; /// use homedisk_utils::database::{Database, User};
/// ///
/// #[tokio::main] /// let user = User::new("medzik", "SuperSecretPassword123");
/// async fn main() { /// db.create_user(&user).await?;
/// let db = Database::open("sqlite::memory:").await.unwrap();
///
/// db.conn.execute(sqlx::query(&fs::read_to_string("../tables.sql").unwrap())).await.unwrap();
///
/// let user = User::new("medzik", "SuperSecretPassword123");
/// db.create_user(&user).await.unwrap();
/// }
/// ``` /// ```
pub async fn create_user(&self, user: &user::User) -> Result<SqliteQueryResult, Error> { pub async fn create_user(&self, user: &user::User) -> Result<SqliteQueryResult, Error> {
debug!("creating user - {}", user.username); debug!("creating user - {}", user.username);
@ -54,3 +41,38 @@ impl Database {
Ok(self.conn.execute(query).await?) Ok(self.conn.execute(query).await?)
} }
} }
#[cfg(test)]
mod tests {
use std::fs;
use sqlx::Executor;
use crate::database::{Database, User};
async fn open_db() -> Database {
Database::open("sqlite::memory:").await.expect("open db")
}
#[tokio::test]
async fn open_db_in_memory() {
open_db().await;
}
#[tokio::test]
async fn create_user() {
let db = open_db().await;
// create user table
db.conn
.execute(sqlx::query(
&fs::read_to_string("../tables.sql").expect("open tables file"),
))
.await
.expect("create tables");
// create new user
let user = User::new("medzik", "SuperSecretPassword123");
db.create_user(&user).await.expect("create user");
}
}