t_rust_less_lib/service/pw_generator/
words.rs

1use 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(&params.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}