Lines
100 %
Functions
35.71 %
Branches
use crate::error::{AccountError, FinanceError};
use sqlx::{Connection, query_file, types::Uuid};
use supp_macro::Builder;
#[derive(Debug, sqlx::FromRow, Builder)]
#[builder(error_kind = "FinanceError")]
pub struct Account {
pub id: Uuid,
pub parent: Option<Uuid>,
}
impl Account {
pub async fn commit<E>(&self, conn: &mut E) -> Result<(), FinanceError>
where
E: Connection<Database = sqlx::Postgres>,
{
let mut tr = conn.begin().await?;
query_file!("sql/account_insert.sql", &self.id, self.parent,)
.execute(&mut *tr)
.await?;
tr.commit().await?;
Ok(())
#[cfg(test)]
mod account_tests {
use super::*;
use crate::commodity::{Commodity, CommodityBuilder};
#[cfg(feature = "testlog")]
use env_logger;
use log;
use sqlx::PgPool;
use tokio::sync::OnceCell;
/// Context for keeping environment intact
static CONTEXT: OnceCell<()> = OnceCell::const_new();
static COMMODITY: OnceCell<Commodity> = OnceCell::const_new();
async fn setup(pool: &PgPool) {
CONTEXT
.get_or_init(|| async {
let _ = env_logger::builder()
.is_test(true)
.filter_level(log::LevelFilter::Trace)
.try_init();
})
.await;
COMMODITY
CommodityBuilder::new()
.fraction(1000)
.id(Uuid::new_v4())
.build()
.unwrap()
let mut conn = pool.acquire().await.unwrap();
COMMODITY.get().unwrap().commit(&mut *conn).await.unwrap();
#[sqlx::test(migrations = "../migrations")]
async fn test_account_store(pool: PgPool) {
setup(&pool).await;
let account = Account {
id: Uuid::new_v4(),
parent: None,
};
sqlx::query!("INSERT INTO accounts (id) VALUES ($1)", &account.id)
.execute(&mut *conn)
.await
.unwrap();
let result = sqlx::query!("SELECT id FROM accounts WHERE id = $1", &account.id)
.fetch_one(&mut *conn)
assert_eq!(account.id, result.id);
async fn test_account_builder(pool: PgPool) -> anyhow::Result<()> {
let build = Account::builder().build();
assert!(build.is_err());
let build = Account::builder().id(Uuid::new_v4()).build();
assert!(build.is_ok());
async fn test_account_commit(pool: PgPool) -> anyhow::Result<()> {
let account = Account::builder().id(Uuid::new_v4()).build().unwrap();
account.commit(&mut *conn).await.unwrap();