109 lines
3.6 KiB
Rust
109 lines
3.6 KiB
Rust
use super::types;
|
||
use crate::domain::misc_types;
|
||
use crate::repo::ingredient::IngredientRepo;
|
||
|
||
#[derive(Default, Debug)]
|
||
pub struct RequestOpts {
|
||
pub lang: Option<misc_types::Lang>,
|
||
pub keys: Option<Vec<String>>,
|
||
}
|
||
|
||
pub fn execute(repo: &impl IngredientRepo, opts: RequestOpts) -> Vec<types::Ingredient> {
|
||
repo.get_ingredients(opts.into())
|
||
}
|
||
|
||
#[cfg(test)]
|
||
mod tests {
|
||
use super::*;
|
||
use crate::{domain::misc_types::Lang, repo::ingredient::InMemoryIngredientRepo};
|
||
|
||
#[test]
|
||
fn should_return_all_ingredients() {
|
||
let repo = InMemoryIngredientRepo::new();
|
||
let res = execute(&repo, RequestOpts::default());
|
||
|
||
match res.as_slice() {
|
||
[banana, apple, orange, salt, sugar] => {
|
||
assert_eq!(banana.key, String::from("banana"));
|
||
assert_eq!(banana.lang, Lang::Rus);
|
||
assert_eq!(banana.name, String::from("Банан"));
|
||
|
||
assert_eq!(apple.key, String::from("apple"));
|
||
assert_eq!(apple.lang, Lang::Rus);
|
||
assert_eq!(apple.name, String::from("Яблоко"));
|
||
|
||
assert_eq!(orange.key, String::from("orange"));
|
||
assert_eq!(orange.lang, Lang::Rus);
|
||
assert_eq!(orange.name, String::from("Апельсин"));
|
||
|
||
assert_eq!(salt.key, String::from("salt"));
|
||
assert_eq!(salt.lang, Lang::Rus);
|
||
assert_eq!(salt.name, String::from("Соль"));
|
||
|
||
assert_eq!(sugar.key, String::from("sugar"));
|
||
assert_eq!(sugar.lang, Lang::Rus);
|
||
assert_eq!(sugar.name, String::from("Сахар"));
|
||
}
|
||
_ => unimplemented!(),
|
||
}
|
||
}
|
||
|
||
#[test]
|
||
fn should_return_preferred_lang_with_fallback() {
|
||
let repo = InMemoryIngredientRepo::new();
|
||
let res = execute(
|
||
&repo,
|
||
RequestOpts {
|
||
lang: Some(Lang::Eng),
|
||
..RequestOpts::default()
|
||
},
|
||
);
|
||
|
||
match res.as_slice() {
|
||
[banana, apple, orange, salt, sugar] => {
|
||
assert_eq!(banana.key, String::from("banana"));
|
||
assert_eq!(banana.lang, Lang::Eng);
|
||
assert_eq!(banana.name, String::from("Banana"));
|
||
|
||
assert_eq!(apple.key, String::from("apple"));
|
||
assert_eq!(apple.lang, Lang::Eng);
|
||
assert_eq!(apple.name, String::from("Apple"));
|
||
|
||
assert_eq!(orange.key, String::from("orange"));
|
||
assert_eq!(orange.lang, Lang::Rus);
|
||
assert_eq!(orange.name, String::from("Апельсин"));
|
||
|
||
assert_eq!(salt.key, String::from("salt"));
|
||
assert_eq!(salt.lang, Lang::Eng);
|
||
assert_eq!(salt.name, String::from("Salt"));
|
||
|
||
assert_eq!(sugar.key, String::from("sugar"));
|
||
assert_eq!(sugar.lang, Lang::Rus);
|
||
assert_eq!(sugar.name, String::from("Сахар"));
|
||
}
|
||
_ => unimplemented!(),
|
||
}
|
||
}
|
||
|
||
#[test]
|
||
fn should_return_filtered_by_keys() {
|
||
let repo = InMemoryIngredientRepo::new();
|
||
let res = execute(
|
||
&repo,
|
||
RequestOpts {
|
||
keys: Some(vec![String::from("apple")]),
|
||
..RequestOpts::default()
|
||
},
|
||
);
|
||
|
||
match res.as_slice() {
|
||
[apple] => {
|
||
assert_eq!(apple.key, String::from("apple"));
|
||
assert_eq!(apple.lang, Lang::Rus);
|
||
assert_eq!(apple.name, String::from("Яблоко"));
|
||
}
|
||
_ => unimplemented!(),
|
||
}
|
||
}
|
||
}
|