t_rust_less_lib/service/pw_generator/
words.rs1use super::wordlist::WORDLIST;
2use crate::api::PasswordGeneratorWordsParam;
3use itertools::Itertools;
4use rand::seq::SliceRandom;
5use rand::thread_rng;
6
7pub fn generate_words(params: &PasswordGeneratorWordsParam) -> String {
8 let mut rng = thread_rng();
9
10 WORDLIST
11 .choose_multiple(&mut rng, params.num_words as usize)
12 .join(¶ms.delim.to_string())
13}
14
15#[cfg(test)]
16mod tests {
17 use super::*;
18 use spectral::prelude::*;
19
20 #[test]
21 fn test_generate_words() {
22 let pw1 = generate_words(&PasswordGeneratorWordsParam {
23 num_words: 3,
24 delim: '.',
25 });
26
27 assert_that(&pw1.len()).is_greater_than(5);
28 assert_that(&pw1.split(".").count()).is_equal_to(3);
29
30 let pw2 = generate_words(&PasswordGeneratorWordsParam {
31 num_words: 5,
32 delim: '-',
33 });
34
35 assert_that(&pw2.len()).is_greater_than(9);
36 assert_that(&pw2.split("-").count()).is_equal_to(5);
37 }
38}