Skip to content

Commit

Permalink
currency: improve test
Browse files Browse the repository at this point in the history
Signed-off-by: Victor Login <batazor111@gmail.com>
  • Loading branch information
batazor committed Sep 28, 2024
1 parent 0f5e3e7 commit 5ccb540
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 33 deletions.
4 changes: 4 additions & 0 deletions boundaries/billing/currency/ops/Makefile/dev.mk
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,7 @@ down: confirm ## Down docker compose
lint: ## Lint code
@cargo fmt
@cargo clippy --fix --allow-dirty

### Testing ============================================================================================================
test: ## Run tests
@cargo test
2 changes: 0 additions & 2 deletions boundaries/billing/currency/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
// src/main.rs

mod cache;
mod domain;
mod infrastructure;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#[cfg(test)]
mod tests {
use super::*;
use crate::cache::cache_service::CacheService;
use crate::cache::CacheService;
use crate::domain::exchange_rate::entities::{Currency, ExchangeRate};
use crate::repository::exchange_rate::in_memory_repository::InMemoryExchangeRateRepository;
use crate::usecases::exchange_rate::fetcher::external_rate_provider::ExternalRateProvider;
Expand All @@ -10,12 +10,30 @@ mod tests {
use rust_decimal_macros::dec;
use std::error::Error;
use std::sync::Arc;
use async_trait::async_trait;
use tokio::sync::Mutex;
use crate::repository::exchange_rate::repository::ExchangeRateRepository;
use crate::usecases::exchange_rate::fetcher::RateFetcherUseCase;

/// A mock provider that always fails to fetch exchange rates.
struct FailingProvider;

#[async_trait]
impl ExternalRateProvider for FailingProvider {
async fn fetch_rate(
&self,
_from: &str,
_to: &str,
) -> Result<ExchangeRate, Box<dyn Error + Send + Sync>> {
Err("Provider failure".into())
}
}

#[tokio::test]
async fn test_fetch_rate_cache_hit() {
// Setup
let repository = Arc::new(InMemoryExchangeRateRepository::new());
let repository: Arc<dyn ExchangeRateRepository + Send + Sync> =
Arc::new(InMemoryExchangeRateRepository::new());
let cache = Arc::new(CacheService::new());
let bloomberg = Arc::new(MockBloombergProvider::new());
let yahoo = Arc::new(MockYahooProvider::new());
Expand Down Expand Up @@ -49,7 +67,8 @@ mod tests {
#[tokio::test]
async fn test_fetch_rate_cache_miss_bloomberg_success() {
// Setup
let repository = Arc::new(InMemoryExchangeRateRepository::new());
let repository: Arc<dyn ExchangeRateRepository + Send + Sync> =
Arc::new(InMemoryExchangeRateRepository::new());
let cache = Arc::new(CacheService::new());
let bloomberg = Arc::new(MockBloombergProvider::new());
let yahoo = Arc::new(MockYahooProvider::new());
Expand All @@ -76,20 +95,8 @@ mod tests {
#[tokio::test]
async fn test_fetch_rate_cache_miss_bloomberg_fail_yahoo_success() {
// Setup
struct FailingProvider;

#[async_trait]
impl ExternalRateProvider for FailingProvider {
async fn fetch_rate(
&self,
_from: &str,
_to: &str,
) -> Result<ExchangeRate, Box<dyn Error + Send + Sync>> {
Err("Provider failure".into())
}
}

let repository = Arc::new(InMemoryExchangeRateRepository::new());
let repository: Arc<dyn ExchangeRateRepository + Send + Sync> =
Arc::new(InMemoryExchangeRateRepository::new());
let cache = Arc::new(CacheService::new());
let failing_provider = Arc::new(FailingProvider);
let yahoo = Arc::new(MockYahooProvider::new());
Expand Down Expand Up @@ -120,20 +127,8 @@ mod tests {
#[tokio::test]
async fn test_fetch_rate_all_providers_fail() {
// Setup
struct FailingProvider;

#[async_trait]
impl ExternalRateProvider for FailingProvider {
async fn fetch_rate(
&self,
_from: &str,
_to: &str,
) -> Result<ExchangeRate, Box<dyn Error + Send + Sync>> {
Err("Provider failure".into())
}
}

let repository = Arc::new(InMemoryExchangeRateRepository::new());
let repository: Arc<dyn ExchangeRateRepository + Send + Sync> =
Arc::new(InMemoryExchangeRateRepository::new());
let cache = Arc::new(CacheService::new());
let failing_provider1 = Arc::new(FailingProvider);
let failing_provider2 = Arc::new(FailingProvider);
Expand Down

0 comments on commit 5ccb540

Please sign in to comment.