Lines
100 %
Functions
30.77 %
Branches
use sqlx::{Connection, query_file, types::Uuid};
use supp_macro::Builder;
use crate::error::{CommodityError, FinanceError};
#[derive(Debug, sqlx::FromRow, Builder)]
#[builder(error_kind = "FinanceError")]
pub struct Commodity {
pub id: Uuid,
pub fraction: i64,
}
impl Commodity {
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/commodity_insert.sql", &self.id, &self.fraction,)
.execute(&mut *tr)
.await?;
tr.commit().await?;
Ok(())
#[cfg(test)]
mod commodity_tests {
use super::*;
#[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();
async fn setup() {
CONTEXT
.get_or_init(|| async {
let _ = env_logger::builder()
.is_test(true)
.filter_level(log::LevelFilter::Trace)
.try_init();
})
.await;
#[sqlx::test(migrations = "../migrations")]
async fn test_commodity_store(pool: PgPool) {
setup().await;
let mut conn = pool.acquire().await.unwrap();
let commodity = Commodity {
id: Uuid::new_v4(),
fraction: 100,
};
sqlx::query!(
"INSERT INTO commodities (id, fraction) \
VALUES ($1, $2)",
&commodity.id,
&commodity.fraction
)
.execute(&mut *conn)
.await
.unwrap();
let result: Commodity = sqlx::query_as("SELECT * FROM commodities WHERE fraction = 100")
.fetch_one(&mut *conn)
assert_eq!(commodity.id, result.id);
async fn test_commodity_commit(pool: PgPool) {
let commodity = CommodityBuilder::new()
.fraction(1000)
.id(Uuid::new_v4())
.build()
commodity.commit(&mut *conn).await.unwrap();
let result: Commodity = sqlx::query_as("SELECT * FROM commodities WHERE fraction = 1000")