Lines
100 %
Functions
35.71 %
Branches
use crate::error::{FinanceError, TagError};
use sqlx::{Connection, query_file, types::Uuid};
use supp_macro::Builder;
#[derive(Debug, sqlx::FromRow, Builder)]
#[builder(error_kind = "TagError")]
pub struct Tag {
pub id: Uuid,
pub tag_name: String,
pub tag_value: String,
pub description: Option<String>,
}
impl Tag {
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/tag_insert.sql",
&self.id,
&self.tag_name,
&self.tag_value,
self.description
)
.execute(&mut *tr)
.await?;
tr.commit().await?;
Ok(())
#[cfg(test)]
mod tag_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_tag_store(pool: PgPool) -> anyhow::Result<()> {
setup().await;
let mut conn = pool.acquire().await?;
let tag = Tag {
id: Uuid::new_v4(),
tag_name: "Category".to_string(),
tag_value: "test".to_string(),
description: None,
};
sqlx::query!(
"INSERT INTO tags (id, tag_name, tag_value, description) \
VALUES ($1, $2, $3, $4)",
&tag.id,
&tag.tag_name,
&tag.tag_value,
tag.description
.execute(&mut *conn)
let result = sqlx::query!("SELECT id, tag_value FROM tags WHERE tag_name = 'Category'")
.fetch_one(&mut *conn)
assert_eq!(tag.id, result.id);
assert_eq!(tag.tag_value, "test".to_string());
let tag2 = Tag {
tag_name: "Cat2".to_string(),
..tag
tag2.commit(&mut *conn).await?;
let result = sqlx::query!("SELECT id, tag_value FROM tags WHERE tag_name = 'Cat2'")
assert_eq!(tag2.id, result.id);
assert_eq!(tag2.tag_value, "test".to_string());
#[tokio::test]
async fn test_tag_builder() -> anyhow::Result<()> {
let build = Tag::builder().id(Uuid::new_v4()).build();
assert!(build.is_err());
let build = Tag::builder()
.id(Uuid::new_v4())
.tag_name("name")
.tag_value("type")
.build();
assert!(build.is_ok());