65 lines
1.7 KiB
Rust
65 lines
1.7 KiB
Rust
// SPDX-FileCopyrightText: 2024 Aravinth Manivannan <realaravinth@batsense.net>
|
|
//
|
|
// 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<dyn GenerateRandomNumberInterface>;
|
|
pub type WebGenerateRandomNumberInterfaceObj = web::Data<GenerateRandomNumberInterfaceObj>;
|
|
|
|
#[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<usize>,
|
|
returning: usize,
|
|
) -> Arc<dyn GenerateRandomNumberInterface> {
|
|
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)
|
|
}
|
|
}
|