{% import "application/macros.tera" as macros %}{% set required = fields | filter(attribute="required_string", value=true) %}{% set string_vos = fields | filter(attribute="string_vo", value=true) %}use std::sync::Arc;
use async_trait::async_trait;
use crate::domain::{{ snake }}::{
errors::{{ pascal }}Error,
model::{{ pascal }},
repository::{{ pascal }}RepositoryTrait,
use_cases::list_{{ plural }}::{List{{ plural_pascal }}Params, List{{ plural_pascal }}UseCaseTrait},
};
pub struct List{{ plural_pascal }}UseCaseImpl {
pub repository: Arc<dyn {{ pascal }}RepositoryTrait>,
}
#[async_trait]
impl List{{ plural_pascal }}UseCaseTrait for List{{ plural_pascal }}UseCaseImpl {
async fn execute(&self, _params: List{{ plural_pascal }}Params) -> Result<Vec<{{ pascal }}>, {{ pascal }}Error> {
tracing::info!("list_{{ plural }}: start");
self.repository.find_all().await.inspect_err(|e| tracing::error!(error = %e, "list_{{ plural }}: repository failed"))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::domain::{{ snake }}::{
model::{{ "{" }}{{ pascal }}, {{ pascal }}Props},
repository::mocks::Mock{{ pascal }}Repository,
};
{% for import in test_imports %} use {{ import }};
{% endfor %}
#[tokio::test]
async fn should_return_all_{{ plural }}() {
let entities = vec![
{{ pascal }}::new({{ pascal }}Props {
{{ macros::props(fields=fields, word="first") }} }).unwrap(),
{{ pascal }}::new({{ pascal }}Props {
{{ macros::props(fields=fields, word="second") }} }).unwrap(),
];
let mut mock_repo = Mock{{ pascal }}Repository::new();
mock_repo
.expect_find_all()
.returning(move || Ok(entities.clone()));
let use_case = List{{ plural_pascal }}UseCaseImpl {
repository: Arc::new(mock_repo),
};
let result = use_case.execute(List{{ plural_pascal }}Params).await;
assert!(result.is_ok());
assert_eq!(result.unwrap().len(), 2);
}
#[tokio::test]
async fn should_return_empty_list_when_no_{{ plural }}_exist() {
let mut mock_repo = Mock{{ pascal }}Repository::new();
mock_repo.expect_find_all().returning(|| Ok(vec![]));
let use_case = List{{ plural_pascal }}UseCaseImpl {
repository: Arc::new(mock_repo),
};
let result = use_case.execute(List{{ plural_pascal }}Params).await;
assert!(result.is_ok());
assert!(result.unwrap().is_empty());
}
}