Test variants

This commit is contained in:
Adrian Woźniak 2022-11-10 16:57:48 +01:00
parent 6a4c38593f
commit 1d0ab456b9
No known key found for this signature in database
GPG Key ID: 0012845A89C7352B
5 changed files with 53 additions and 38 deletions

View File

@ -905,9 +905,9 @@ pub mod v2 {
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
pub use crate::{ pub use crate::{
Days, FileName, LocalPath, PhotoId, Price, ProductCategory, ProductId, ProductLongDesc, Day, Days, FileName, LocalPath, PhotoId, Price, ProductCategory, ProductId,
ProductName, ProductPhotoId, ProductShortDesc, Quantity, QuantityUnit, RecordId, StockId, ProductLongDesc, ProductName, ProductPhotoId, ProductShortDesc, Quantity, QuantityUnit,
UniqueName, RecordId, StockId, UniqueName,
}; };
#[cfg_attr(feature = "db", derive(sqlx::Type))] #[cfg_attr(feature = "db", derive(sqlx::Type))]

View File

@ -8,7 +8,7 @@ pub enum Error {
#[error("Failed to fetch all photo")] #[error("Failed to fetch all photo")]
All, All,
#[error("Failed to fetch photos for products")] #[error("Failed to fetch photos for products")]
PhotosForProducts, PhotosForProductVariants,
} }
pub type Result<T> = std::result::Result<T, Error>; pub type Result<T> = std::result::Result<T, Error>;
@ -20,7 +20,7 @@ pub struct AllPhotos {
} }
impl AllPhotos { impl AllPhotos {
pub async fn run(self, pool: &mut PgT<'_>) -> Result<Vec<Photo>> { pub async fn run(self, t: &mut PgT<'_>) -> Result<Vec<Photo>> {
sqlx::query_as( sqlx::query_as(
r#" r#"
SELECT id, local_path, file_name, unique_name SELECT id, local_path, file_name, unique_name
@ -31,7 +31,7 @@ LIMIT $1 OFFSET $2
) )
.bind(self.limit) .bind(self.limit)
.bind(self.offset) .bind(self.offset)
.fetch_all(pool) .fetch_all(t)
.await .await
.map_err(|e| { .map_err(|e| {
tracing::error!("{e:?}"); tracing::error!("{e:?}");
@ -75,42 +75,38 @@ RETURNING id, local_path, file_name, unique_name
//###################################### //######################################
#[derive(Debug)] #[derive(Debug)]
pub struct PhotosForProducts { pub struct PhotosForProductVariants {
pub product_ids: Vec<ProductId>, pub product_variant_ids: Vec<ProductVariantId>,
} }
impl PhotosForProducts { impl PhotosForProductVariants {
pub async fn run(self, pool: &mut PgT<'_>) -> Result<Vec<model::ProductLinkedPhoto>> { pub async fn run(self, pool: &mut PgT<'_>) -> Result<Vec<ProductLinkedPhoto>> {
tracing::debug!("all product ids {:?}", self.product_ids); tracing::debug!("all product ids {:?}", self.product_variant_ids);
let res: Vec<model::ProductLinkedPhoto> = db_utils::MultiLoad::new( let res: Vec<ProductLinkedPhoto> = db_utils::MultiLoad::new(
pool, pool,
r#" r#"
SELECT photos.id AS photo_id, SELECT photos.id AS photo_id,
photos.local_path AS local_path, photos.local_path AS local_path,
photos.file_name AS file_name, photos.file_name AS file_name,
product_photos.product_id AS product_id, product_photos.product_variant_id AS product_variant_id,
photos.unique_name AS unique_name photos.unique_name AS unique_name
FROM photos FROM photos
INNER JOIN product_photos INNER JOIN product_photos
ON photos.id = product_photos.photo_id ON photos.id = product_photos.photo_id
INNER JOIN product_variants
ON product_variants.id = product_photos.product_variant_id
INNER JOIN products
ON product_variants.product_id = products.id
WHERE WHERE
"#, "#,
" products.id =", " product_photos.product_variant_id =",
) )
.with_sorting("photos.id ASC") .with_sorting("photos.id ASC")
.allow_over_max() .allow_over_max()
.with_size(1000) .with_size(2000)
.load( .load(
self.product_ids.len(), self.product_variant_ids.len(),
self.product_ids.into_iter().map(|id| *id), self.product_variant_ids.into_iter().map(|id| *id),
|e| { |e| {
tracing::error!("{}", e); tracing::error!("{}", e);
dbg!(e); dbg!(e);
Error::PhotosForProducts Error::PhotosForProductVariants
}, },
) )
.await?; .await?;
@ -126,6 +122,8 @@ mod tests {
use model::Day; use model::Day;
use uuid::Uuid; use uuid::Uuid;
use crate::db::Database;
pub struct NoOpts; pub struct NoOpts;
impl UpdateConfig for NoOpts {} impl UpdateConfig for NoOpts {}
@ -192,7 +190,7 @@ mod tests {
.unwrap() .unwrap()
} }
#[actix::test] #[tokio::test]
async fn create_photo() { async fn create_photo() {
testx::db_t_ref!(t); testx::db_t_ref!(t);
@ -201,7 +199,7 @@ mod tests {
testx::db_rollback!(t); testx::db_rollback!(t);
} }
#[actix::test] #[tokio::test]
async fn all() { async fn all() {
testx::db_t_ref!(t); testx::db_t_ref!(t);
@ -209,13 +207,19 @@ mod tests {
let p2 = test_photo(&mut t, None, None, None).await; let p2 = test_photo(&mut t, None, None, None).await;
let p3 = test_photo(&mut t, None, None, None).await; let p3 = test_photo(&mut t, None, None, None).await;
let all = all_photos(AllPhotos, &mut t).await.unwrap(); let all = AllPhotos {
limit: 1000,
offset: 0,
}
.run(&mut t)
.await
.unwrap();
testx::db_rollback!(t); testx::db_rollback!(t);
assert_eq!(all, vec![p1, p2, p3]); assert_eq!(all, vec![p1, p2, p3]);
} }
#[actix::test] #[tokio::test]
async fn products_photos() { async fn products_photos() {
testx::db_t_ref!(t); testx::db_t_ref!(t);
@ -237,8 +241,8 @@ mod tests {
let p8 = test_product_photo(&mut t, product_variant_3.id).await; let p8 = test_product_photo(&mut t, product_variant_3.id).await;
let p9 = test_product_photo(&mut t, product_variant_3.id).await; let p9 = test_product_photo(&mut t, product_variant_3.id).await;
let mut all = PhotosForProducts { let mut all = PhotosForProductVariants {
product_ids: vec![product_1.id, product_3.id], product_variant_ids: vec![product_variant_1.id, product_variant_3.id],
} }
.run(&mut t) .run(&mut t)
.await .await

View File

@ -100,6 +100,7 @@ mod tests {
use uuid::Uuid; use uuid::Uuid;
use crate::db::product_variants::CreateProductVariant; use crate::db::product_variants::CreateProductVariant;
use crate::db::Database;
pub struct NoOpts; pub struct NoOpts;
@ -157,7 +158,7 @@ mod tests {
.unwrap() .unwrap()
} }
#[actix::test] #[tokio::test]
async fn create_photo() { async fn create_photo() {
testx::db_t_ref!(t); testx::db_t_ref!(t);
@ -166,7 +167,7 @@ mod tests {
testx::db_rollback!(t); testx::db_rollback!(t);
} }
#[actix::test] #[tokio::test]
async fn delete() { async fn delete() {
testx::db_t_ref!(t); testx::db_t_ref!(t);
@ -182,7 +183,7 @@ mod tests {
assert_ne!(deleted, Some(p3)); assert_ne!(deleted, Some(p3));
} }
#[actix::test] #[tokio::test]
async fn create() { async fn create() {
testx::db_t_ref!(t); testx::db_t_ref!(t);

View File

@ -265,8 +265,11 @@ WHERE
mod tests { mod tests {
use config::UpdateConfig; use config::UpdateConfig;
use model::v2::*; use model::v2::*;
use model::Day;
use uuid::Uuid; use uuid::Uuid;
use crate::db::Database;
pub struct NoOpts; pub struct NoOpts;
impl UpdateConfig for NoOpts {} impl UpdateConfig for NoOpts {}
@ -310,7 +313,13 @@ mod tests {
let p2 = test_product(&mut t, None, None, None, None, None, None).await; let p2 = test_product(&mut t, None, None, None, None, None, None).await;
let p3 = test_product(&mut t, None, None, None, None, None, None).await; let p3 = test_product(&mut t, None, None, None, None, None, None).await;
let products = super::all(AllProducts, &mut t).await.unwrap(); let products = AllProducts {
limit: 10000,
offset: 0,
}
.run(&mut t)
.await
.unwrap();
testx::db_rollback!(t); testx::db_rollback!(t);
assert_eq!(products, vec![p1, p2, p3]); assert_eq!(products, vec![p1, p2, p3]);

View File

@ -189,9 +189,12 @@ mod tests {
use config::UpdateConfig; use config::UpdateConfig;
use fake::faker::lorem::en as lorem; use fake::faker::lorem::en as lorem;
use fake::Fake; use fake::Fake;
use model::*; use model::v2::*;
use model::Day;
use uuid::Uuid; use uuid::Uuid;
use crate::db::Database;
pub struct NoOpts; pub struct NoOpts;
impl UpdateConfig for NoOpts {} impl UpdateConfig for NoOpts {}
@ -292,12 +295,12 @@ mod tests {
.run(&mut t) .run(&mut t)
.await .await
.unwrap(); .unwrap();
let reloaded = super::find_stock(FindStock { id: second.id }, &mut t).await; let reloaded = FindStock { id: second.id }.run(&mut t).await;
testx::db_rollback!(t); testx::db_rollback!(t);
assert_eq!(deleted, Some(second)); assert_eq!(deleted, Some(second));
assert_ne!(deleted, Some(first)); assert_ne!(deleted, Some(first));
assert_eq!(reloaded, Err(crate::Error::Stock(super::Error::NotFound))); assert_eq!(reloaded, Err(super::Error::NotFound));
} }
#[tokio::test] #[tokio::test]
@ -317,9 +320,7 @@ mod tests {
.run(&mut t) .run(&mut t)
.await .await
.unwrap(); .unwrap();
let reloaded = super::find_stock(FindStock { id: second.id }, &mut t) let reloaded = FindStock { id: second.id }.run(&mut t).await.unwrap();
.await
.unwrap();
testx::db_rollback!(t); testx::db_rollback!(t);
assert_eq!( assert_eq!(