recipes/api/src/domain/ingredient/fetch_by_key.rs

91 lines
2.3 KiB
Rust

use super::types;
use crate::{
domain::{Context, Lang},
repo::ingredient::IngredientRepo,
};
#[derive(Default, Debug)]
pub struct RequestOpts {
pub lang: Option<Lang>,
}
pub enum ResponseError {
NotFound,
}
pub fn execute(
repo: &impl IngredientRepo,
ctx: &Context,
key: String,
) -> Result<types::Ingredient, ResponseError> {
match repo.get_ingredient_opt(ctx, key) {
Some(ing) => Ok(ing),
_ => Err(ResponseError::NotFound),
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{
domain::{Context, Lang},
repo::ingredient::InMemoryIngredientRepo,
};
#[test]
fn should_return_ingredient() {
let repo = InMemoryIngredientRepo::new();
let res = execute(&repo, &Context::default(), String::from("apple"));
match res {
Ok(apple) => {
assert_eq!(apple.key, String::from("apple"));
assert_eq!(apple.lang, Lang::Rus);
assert_eq!(apple.name, String::from("Яблоко"));
}
_ => unimplemented!(),
}
}
#[test]
fn should_return_ingredient_with_choosed_lang() {
let repo = InMemoryIngredientRepo::new();
let res = execute(&repo, &Context::eng(), String::from("apple"));
match res {
Ok(apple) => {
assert_eq!(apple.key, String::from("apple"));
assert_eq!(apple.lang, Lang::Eng);
assert_eq!(apple.name, String::from("Apple"));
}
_ => unimplemented!(),
}
}
#[test]
fn should_return_ingredient_with_fallback_lang() {
let repo = InMemoryIngredientRepo::new();
let res = execute(&repo, &Context::eng(), String::from("orange"));
match res {
Ok(orange) => {
assert_eq!(orange.key, String::from("orange"));
assert_eq!(orange.lang, Lang::Rus);
assert_eq!(orange.name, String::from("Апельсин"));
}
_ => unimplemented!(),
}
}
#[test]
fn should_throw_not_found_error() {
let repo = InMemoryIngredientRepo::new();
let res = execute(&repo, &Context::default(), String::from("wildberries"));
match res {
Err(ResponseError::NotFound) => {}
_ => unimplemented!(),
}
}
}