// SPDX-FileCopyrightText: 2024 Aravinth Manivannan // // SPDX-License-Identifier: AGPL-3.0-or-later use std::sync::Arc; use actix_web::web; use mockall::predicate::*; use mockall::*; #[cfg(test)] #[allow(unused_imports)] use tests::*; pub type GenerateRandomNumberInterfaceObj = Arc; pub type WebGenerateRandomNumberInterfaceObj = web::Data; #[automock] pub trait GenerateRandomNumberInterface: Send + Sync { fn get_random(&self, num_digits: u32) -> usize; } pub struct GenerateRandomNumber; impl GenerateRandomNumberInterface for GenerateRandomNumber { fn get_random(&self, num_digits: u32) -> usize { use rand::{rngs::ThreadRng, thread_rng, Rng}; let mut rng: ThreadRng = thread_rng(); let base: usize = 10; rng.gen_range(0..base.pow(num_digits) - 1) } } impl GenerateRandomNumber { pub fn inject() -> impl FnOnce(&mut web::ServiceConfig) { let g = WebGenerateRandomNumberInterfaceObj::new(Arc::new(GenerateRandomNumber)); let f = move |cfg: &mut web::ServiceConfig| { cfg.app_data(g); }; Box::new(f) } } #[cfg(test)] pub mod tests { use super::*; use std::sync::Arc; pub fn mock_generate_random_number( times: Option, returning: usize, ) -> Arc { let mut m = MockGenerateRandomNumberInterface::new(); if let Some(times) = times { m.expect_get_random().times(times).return_const(returning); } else { m.expect_get_random().return_const(returning); } Arc::new(m) } }