1use sqlx::{Connection, query_file, types::Uuid};
2use supp_macro::Builder;
3
4use crate::error::{CommodityError, FinanceError};
5
6#[derive(Debug, sqlx::FromRow, Builder)]
7#[builder(error_kind = "FinanceError")]
8pub struct Commodity {
9 pub id: Uuid,
10}
11
12impl Commodity {
13 pub async fn commit<E>(&self, conn: &mut E) -> Result<(), FinanceError>
14 where
15 E: Connection<Database = sqlx::Postgres>,
16 {
17 let mut tr = conn.begin().await?;
18
19 query_file!("sql/commodity_insert.sql", &self.id)
20 .execute(&mut *tr)
21 .await?;
22 tr.commit().await?;
23
24 Ok(())
25 }
26}
27
28#[cfg(test)]
29mod commodity_tests {
30 use super::*;
31 #[cfg(feature = "testlog")]
32 use env_logger;
33 #[cfg(feature = "testlog")]
34 use log;
35 use sqlx::PgPool;
36 use tokio::sync::OnceCell;
37
38 static CONTEXT: OnceCell<()> = OnceCell::const_new();
40
41 async fn setup() {
42 CONTEXT
43 .get_or_init(|| async {
44 #[cfg(feature = "testlog")]
45 let _ = env_logger::builder()
46 .is_test(true)
47 .filter_level(log::LevelFilter::Trace)
48 .try_init();
49 })
50 .await;
51 }
52
53 #[sqlx::test(migrations = "../migrations")]
54 async fn test_commodity_store(pool: PgPool) {
55 setup().await;
56 let mut conn = pool.acquire().await.unwrap();
57 let commodity = Commodity { id: Uuid::new_v4() };
58
59 sqlx::query!("INSERT INTO commodities (id) VALUES ($1)", &commodity.id,)
60 .execute(&mut *conn)
61 .await
62 .unwrap();
63
64 let result: Commodity = sqlx::query_as("SELECT * FROM commodities WHERE id = $1")
65 .bind(commodity.id)
66 .fetch_one(&mut *conn)
67 .await
68 .unwrap();
69
70 assert_eq!(commodity.id, result.id);
71 }
72
73 #[sqlx::test(migrations = "../migrations")]
74 async fn test_commodity_commit(pool: PgPool) {
75 setup().await;
76 let mut conn = pool.acquire().await.unwrap();
77 let commodity = CommodityBuilder::new().id(Uuid::new_v4()).build().unwrap();
78
79 commodity.commit(&mut *conn).await.unwrap();
80
81 let result: Commodity = sqlx::query_as("SELECT * FROM commodities WHERE id = $1")
82 .bind(commodity.id)
83 .fetch_one(&mut *conn)
84 .await
85 .unwrap();
86
87 assert_eq!(commodity.id, result.id);
88 }
89}