Import and export text files, reorganize tests (again)
This commit is contained in:
		
							parent
							
								
									1dd0083b5d
								
							
						
					
					
						commit
						704fc91ef8
					
				
							
								
								
									
										1
									
								
								blocks.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								blocks.txt
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					example.com
 | 
				
			||||||
							
								
								
									
										53
									
								
								src/list.rs
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								src/list.rs
									
									
									
									
									
								
							| 
						 | 
					@ -1,53 +0,0 @@
 | 
				
			||||||
use std::collections::HashMap;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
mod source;
 | 
					 | 
				
			||||||
mod tests;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub use source::*;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
 | 
					 | 
				
			||||||
pub enum Action {
 | 
					 | 
				
			||||||
    Block,
 | 
					 | 
				
			||||||
    Silence,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[derive(Debug, Default, Eq, PartialEq)]
 | 
					 | 
				
			||||||
pub struct ActionTrust {
 | 
					 | 
				
			||||||
    pub block: u16,
 | 
					 | 
				
			||||||
    pub silence: u16,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
impl ActionTrust {
 | 
					 | 
				
			||||||
    pub fn add_action(&mut self, action: Action, trust: u16) -> &mut Self {
 | 
					 | 
				
			||||||
        match action {
 | 
					 | 
				
			||||||
            Action::Block => self.block += trust,
 | 
					 | 
				
			||||||
            Action::Silence => self.silence += trust,
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        self
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
impl From<(u16, u16)> for ActionTrust {
 | 
					 | 
				
			||||||
    fn from(value: (u16, u16)) -> Self {
 | 
					 | 
				
			||||||
        Self {
 | 
					 | 
				
			||||||
            block: value.0,
 | 
					 | 
				
			||||||
            silence: value.1,
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[derive(Debug, Default, Eq, PartialEq)]
 | 
					 | 
				
			||||||
pub struct ModerationList(pub HashMap<String, ActionTrust>);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
impl ModerationList {
 | 
					 | 
				
			||||||
    pub fn add_source(&mut self, src: Source) -> &mut Self {
 | 
					 | 
				
			||||||
        let items = src.actions.into_iter();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (host, action) in items {
 | 
					 | 
				
			||||||
            let entry = self.0.entry(host).or_default();
 | 
					 | 
				
			||||||
            entry.add_action(action, src.trust);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        self
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,49 +0,0 @@
 | 
				
			||||||
use std::{collections::HashMap, fs};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
use super::*;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[derive(Debug, PartialEq, Eq)]
 | 
					 | 
				
			||||||
pub struct Source {
 | 
					 | 
				
			||||||
    pub actions: HashMap<String, Action>,
 | 
					 | 
				
			||||||
    pub trust: u16,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
impl Default for Source {
 | 
					 | 
				
			||||||
    fn default() -> Self {
 | 
					 | 
				
			||||||
        Self {
 | 
					 | 
				
			||||||
            actions: HashMap::new(),
 | 
					 | 
				
			||||||
            trust: 100,
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
impl From<HashMap<String, Action>> for Source {
 | 
					 | 
				
			||||||
    fn from(map: HashMap<String, Action>) -> Self {
 | 
					 | 
				
			||||||
        Self {
 | 
					 | 
				
			||||||
            actions: map,
 | 
					 | 
				
			||||||
            trust: 100,
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
impl Source {
 | 
					 | 
				
			||||||
    pub fn build(map: HashMap<String, Action>, trust: u16) -> Self {
 | 
					 | 
				
			||||||
        let mut src = Self::from(map);
 | 
					 | 
				
			||||||
        src.trust = trust;
 | 
					 | 
				
			||||||
        src
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pub fn add_from_file(&mut self, path: &str, action: Action) -> &mut Self {
 | 
					 | 
				
			||||||
        let contents = fs::read_to_string(path).unwrap();
 | 
					 | 
				
			||||||
        for host in contents.lines().filter(|line| !line.is_empty()) {
 | 
					 | 
				
			||||||
            self.add_action(host, action);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        self
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fn add_action(&mut self, host: &str, action: Action) -> &mut Self {
 | 
					 | 
				
			||||||
        self.actions.insert(host.to_string(), action);
 | 
					 | 
				
			||||||
        self
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,144 +0,0 @@
 | 
				
			||||||
#![cfg(test)]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
use std::collections::HashMap;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
use super::*;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[test]
 | 
					 | 
				
			||||||
fn add_action() {
 | 
					 | 
				
			||||||
    let mut at = ActionTrust::default();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    at.add_action(Action::Block, 123)
 | 
					 | 
				
			||||||
        .add_action(Action::Silence, 456);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let test_at = ActionTrust {
 | 
					 | 
				
			||||||
        block: 123,
 | 
					 | 
				
			||||||
        silence: 456,
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    assert_eq!(at, test_at);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[test]
 | 
					 | 
				
			||||||
fn add_action_overlap() {
 | 
					 | 
				
			||||||
    let mut at = ActionTrust::default();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    at.add_action(Action::Block, 123)
 | 
					 | 
				
			||||||
        .add_action(Action::Block, 333)
 | 
					 | 
				
			||||||
        .add_action(Action::Silence, 123);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let test_at = ActionTrust {
 | 
					 | 
				
			||||||
        block: 456,
 | 
					 | 
				
			||||||
        silence: 123,
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    assert_eq!(at, test_at);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[test]
 | 
					 | 
				
			||||||
fn source_new_from_hashmap() {
 | 
					 | 
				
			||||||
    let src1 = Source::from(HashMap::from([
 | 
					 | 
				
			||||||
        (String::from("example.com"), Action::Block),
 | 
					 | 
				
			||||||
        (String::from("example.org"), Action::Silence),
 | 
					 | 
				
			||||||
        (String::from("example.net"), Action::Block),
 | 
					 | 
				
			||||||
    ]));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    assert_eq!(
 | 
					 | 
				
			||||||
        src1.actions,
 | 
					 | 
				
			||||||
        HashMap::from([
 | 
					 | 
				
			||||||
            (String::from("example.com"), Action::Block),
 | 
					 | 
				
			||||||
            (String::from("example.org"), Action::Silence),
 | 
					 | 
				
			||||||
            (String::from("example.net"), Action::Block),
 | 
					 | 
				
			||||||
        ])
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    assert_eq!(src1.trust, 100);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[test]
 | 
					 | 
				
			||||||
fn source_build_from_hashmap() {
 | 
					 | 
				
			||||||
    let src2 = Source::build(
 | 
					 | 
				
			||||||
        HashMap::from([
 | 
					 | 
				
			||||||
            (String::from("example.com"), Action::Block),
 | 
					 | 
				
			||||||
            (String::from("example.org"), Action::Silence),
 | 
					 | 
				
			||||||
            (String::from("example.net"), Action::Block),
 | 
					 | 
				
			||||||
        ]),
 | 
					 | 
				
			||||||
        123,
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    assert_eq!(
 | 
					 | 
				
			||||||
        src2.actions,
 | 
					 | 
				
			||||||
        HashMap::from([
 | 
					 | 
				
			||||||
            (String::from("example.com"), Action::Block),
 | 
					 | 
				
			||||||
            (String::from("example.org"), Action::Silence),
 | 
					 | 
				
			||||||
            (String::from("example.net"), Action::Block),
 | 
					 | 
				
			||||||
        ])
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
    assert_eq!(src2.trust, 123);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[test]
 | 
					 | 
				
			||||||
fn source_add_from_file() {
 | 
					 | 
				
			||||||
    let mut src = Source::default();
 | 
					 | 
				
			||||||
    src.add_from_file("example_blocklist1.txt", Action::Block)
 | 
					 | 
				
			||||||
        .add_from_file("example_mutelist1.txt", Action::Silence);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let test_src = Source::from(HashMap::from([
 | 
					 | 
				
			||||||
        (String::from("example.com"), Action::Block),
 | 
					 | 
				
			||||||
        (String::from("example.org"), Action::Block),
 | 
					 | 
				
			||||||
        (String::from("example.net"), Action::Silence),
 | 
					 | 
				
			||||||
    ]));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    assert_eq!(test_src, src);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[test]
 | 
					 | 
				
			||||||
fn build_moderation_list() {
 | 
					 | 
				
			||||||
    let mut ml = ModerationList::default();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let src1 = Source::from(HashMap::from([
 | 
					 | 
				
			||||||
        (String::from("example.com"), Action::Block),
 | 
					 | 
				
			||||||
        (String::from("example.org"), Action::Silence),
 | 
					 | 
				
			||||||
        (String::from("example.net"), Action::Block),
 | 
					 | 
				
			||||||
    ]));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let mut src2 = Source::default();
 | 
					 | 
				
			||||||
    src2.add_from_file("example_blocklist1.txt", Action::Block)
 | 
					 | 
				
			||||||
        .add_from_file("example_mutelist1.txt", Action::Silence);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ml.add_source(src1).add_source(src2);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let test_ml = ModerationList(HashMap::from([
 | 
					 | 
				
			||||||
        (String::from("example.com"), ActionTrust::from((200, 0))),
 | 
					 | 
				
			||||||
        (String::from("example.org"), ActionTrust::from((100, 100))),
 | 
					 | 
				
			||||||
        (String::from("example.net"), ActionTrust::from((100, 100))),
 | 
					 | 
				
			||||||
    ]));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    assert_eq!(ml, test_ml);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let src3 = Source::build(
 | 
					 | 
				
			||||||
        HashMap::from([
 | 
					 | 
				
			||||||
            (String::from("example.com"), Action::Block),
 | 
					 | 
				
			||||||
            (String::from("example.org"), Action::Silence),
 | 
					 | 
				
			||||||
        ]),
 | 
					 | 
				
			||||||
        200,
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let src4 = Source::build(
 | 
					 | 
				
			||||||
        HashMap::from([
 | 
					 | 
				
			||||||
            (String::from("example.com"), Action::Block),
 | 
					 | 
				
			||||||
            (String::from("example.net"), Action::Silence),
 | 
					 | 
				
			||||||
        ]),
 | 
					 | 
				
			||||||
        50,
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ml.add_source(src3).add_source(src4);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let test_ml = ModerationList(HashMap::from([
 | 
					 | 
				
			||||||
        (String::from("example.com"), ActionTrust::from((450, 0))),
 | 
					 | 
				
			||||||
        (String::from("example.org"), ActionTrust::from((100, 300))),
 | 
					 | 
				
			||||||
        (String::from("example.net"), ActionTrust::from((100, 150))),
 | 
					 | 
				
			||||||
    ]));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    assert_eq!(ml, test_ml);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
// src/main.rs
 | 
					// src/main.rs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mod list;
 | 
					mod manip;
 | 
				
			||||||
 | 
					mod tests;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn main() {
 | 
					fn main() {
 | 
				
			||||||
    println!("Hello, world!");
 | 
					    println!("Hello, world!");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										133
									
								
								src/manip.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								src/manip.rs
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,133 @@
 | 
				
			||||||
 | 
					use std::{collections::HashMap, fs};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use log::error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ENUMS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Specifies a moderation action, whether block or silence
 | 
				
			||||||
 | 
					#[derive(Clone, Copy, Debug, Eq, PartialEq)]
 | 
				
			||||||
 | 
					pub enum ModAction {
 | 
				
			||||||
 | 
					    Block,
 | 
				
			||||||
 | 
					    Silence,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// STRUCTS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Indicates weight of moderation action on a host
 | 
				
			||||||
 | 
					#[derive(Debug, Default, Eq, PartialEq)]
 | 
				
			||||||
 | 
					pub struct ModActionTrust {
 | 
				
			||||||
 | 
					    pub block: u16,
 | 
				
			||||||
 | 
					    pub silence: u16,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl ModActionTrust {
 | 
				
			||||||
 | 
					    pub fn add_action(&mut self, action: ModAction, trust: u16) -> &mut Self {
 | 
				
			||||||
 | 
					        match action {
 | 
				
			||||||
 | 
					            ModAction::Block => self.block += trust,
 | 
				
			||||||
 | 
					            ModAction::Silence => self.silence += trust,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        self
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<(u16, u16)> for ModActionTrust {
 | 
				
			||||||
 | 
					    fn from(value: (u16, u16)) -> Self {
 | 
				
			||||||
 | 
					        Self {
 | 
				
			||||||
 | 
					            block: value.0,
 | 
				
			||||||
 | 
					            silence: value.1,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Contains a mapping of hosts to moderation actions as well as a trust value,
 | 
				
			||||||
 | 
					/// which is used to weight moderation actions when building a mod map
 | 
				
			||||||
 | 
					#[derive(Debug, PartialEq, Eq)]
 | 
				
			||||||
 | 
					pub struct ModSource {
 | 
				
			||||||
 | 
					    pub actions: HashMap<String, ModAction>,
 | 
				
			||||||
 | 
					    pub trust: u16,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl Default for ModSource {
 | 
				
			||||||
 | 
					    fn default() -> Self {
 | 
				
			||||||
 | 
					        Self {
 | 
				
			||||||
 | 
					            actions: HashMap::new(),
 | 
				
			||||||
 | 
					            trust: 100,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<HashMap<String, ModAction>> for ModSource {
 | 
				
			||||||
 | 
					    fn from(map: HashMap<String, ModAction>) -> Self {
 | 
				
			||||||
 | 
					        Self {
 | 
				
			||||||
 | 
					            actions: map,
 | 
				
			||||||
 | 
					            trust: 100,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl ModSource {
 | 
				
			||||||
 | 
					    fn add_action(&mut self, host: &str, action: ModAction) -> &mut Self {
 | 
				
			||||||
 | 
					        self.actions.insert(host.to_string(), action);
 | 
				
			||||||
 | 
					        self
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn build(map: HashMap<String, ModAction>, trust: u16) -> Self {
 | 
				
			||||||
 | 
					        let mut src = Self::from(map);
 | 
				
			||||||
 | 
					        src.trust = trust;
 | 
				
			||||||
 | 
					        src
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn import_file(&mut self, path: &str, action: ModAction) -> &mut Self {
 | 
				
			||||||
 | 
					        let contents = fs::read_to_string(path).unwrap();
 | 
				
			||||||
 | 
					        for host in contents.lines().filter(|line| !line.is_empty()) {
 | 
				
			||||||
 | 
					            self.add_action(host, action);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// A map of hosts (as strings) to weighted mod actions
 | 
				
			||||||
 | 
					#[derive(Debug, Default, Eq, PartialEq)]
 | 
				
			||||||
 | 
					pub struct ModMap(pub HashMap<String, ModActionTrust>);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl ModMap {
 | 
				
			||||||
 | 
					    pub fn add_source(&mut self, src: ModSource) -> &mut Self {
 | 
				
			||||||
 | 
					        let items = src.actions.into_iter();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (host, action) in items {
 | 
				
			||||||
 | 
					            let entry = self.0.entry(host).or_default();
 | 
				
			||||||
 | 
					            entry.add_action(action, src.trust);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn export_file(self, block_path: &str, mute_path: &str, heat: (u16, u16)) -> std::io::Result<()> {
 | 
				
			||||||
 | 
					        if self.0.is_empty() {
 | 
				
			||||||
 | 
					            error!("Nothing to export!");
 | 
				
			||||||
 | 
					            return Ok(())
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let (block_thresh, mute_thresh) = heat;
 | 
				
			||||||
 | 
					        let mut block_output: String = String::default();
 | 
				
			||||||
 | 
					        let mut mute_output: String = String::default();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for item in self.0.into_iter() {
 | 
				
			||||||
 | 
					            let (block_trust, mute_trust) = (item.1.block, item.1.silence);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if block_trust >= block_thresh {
 | 
				
			||||||
 | 
					                block_output.push_str(&(item.0.clone() + "\n"));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if mute_trust >= mute_thresh {
 | 
				
			||||||
 | 
					                mute_output.push_str(&(item.0.clone() + "\n"));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fs::write(block_path, block_output)?;
 | 
				
			||||||
 | 
					        fs::write(mute_path, mute_output)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Ok(())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										1
									
								
								src/tests.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/tests.rs
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					mod manip;
 | 
				
			||||||
							
								
								
									
										200
									
								
								src/tests/manip.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								src/tests/manip.rs
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,200 @@
 | 
				
			||||||
 | 
					#![cfg(test)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use std::{collections::HashMap, fs};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use crate::manip::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[test]
 | 
				
			||||||
 | 
					fn modaction_add() {
 | 
				
			||||||
 | 
					    let mut at = ModActionTrust::default();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    at.add_action(ModAction::Block, 123)
 | 
				
			||||||
 | 
					        .add_action(ModAction::Silence, 456);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let test_at = ModActionTrust {
 | 
				
			||||||
 | 
					        block: 123,
 | 
				
			||||||
 | 
					        silence: 456,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert_eq!(at, test_at);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[test]
 | 
				
			||||||
 | 
					fn modaction_combine() {
 | 
				
			||||||
 | 
					    let mut at = ModActionTrust::default();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    at.add_action(ModAction::Block, 123)
 | 
				
			||||||
 | 
					        .add_action(ModAction::Block, 333)
 | 
				
			||||||
 | 
					        .add_action(ModAction::Silence, 123);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let test_at = ModActionTrust {
 | 
				
			||||||
 | 
					        block: 456,
 | 
				
			||||||
 | 
					        silence: 123,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert_eq!(at, test_at);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[test]
 | 
				
			||||||
 | 
					fn modsource_from_map() {
 | 
				
			||||||
 | 
					    let src1 = ModSource::from(HashMap::from([
 | 
				
			||||||
 | 
					        (String::from("example.com"), ModAction::Block),
 | 
				
			||||||
 | 
					        (String::from("example.org"), ModAction::Silence),
 | 
				
			||||||
 | 
					        (String::from("example.net"), ModAction::Block),
 | 
				
			||||||
 | 
					    ]));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert_eq!(
 | 
				
			||||||
 | 
					        src1.actions,
 | 
				
			||||||
 | 
					        HashMap::from([
 | 
				
			||||||
 | 
					            (String::from("example.com"), ModAction::Block),
 | 
				
			||||||
 | 
					            (String::from("example.org"), ModAction::Silence),
 | 
				
			||||||
 | 
					            (String::from("example.net"), ModAction::Block),
 | 
				
			||||||
 | 
					        ])
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert_eq!(src1.trust, 100);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[test]
 | 
				
			||||||
 | 
					fn modsource_from_map_and_trust() {
 | 
				
			||||||
 | 
					    let src2 = ModSource::build(
 | 
				
			||||||
 | 
					        HashMap::from([
 | 
				
			||||||
 | 
					            (String::from("example.com"), ModAction::Block),
 | 
				
			||||||
 | 
					            (String::from("example.org"), ModAction::Silence),
 | 
				
			||||||
 | 
					            (String::from("example.net"), ModAction::Block),
 | 
				
			||||||
 | 
					        ]),
 | 
				
			||||||
 | 
					        123,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert_eq!(
 | 
				
			||||||
 | 
					        src2.actions,
 | 
				
			||||||
 | 
					        HashMap::from([
 | 
				
			||||||
 | 
					            (String::from("example.com"), ModAction::Block),
 | 
				
			||||||
 | 
					            (String::from("example.org"), ModAction::Silence),
 | 
				
			||||||
 | 
					            (String::from("example.net"), ModAction::Block),
 | 
				
			||||||
 | 
					        ])
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					    assert_eq!(src2.trust, 123);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[test]
 | 
				
			||||||
 | 
					fn modsource_from_file() {
 | 
				
			||||||
 | 
					    let mut src = ModSource::default();
 | 
				
			||||||
 | 
					    src.import_file("example_blocklist1.txt", ModAction::Block)
 | 
				
			||||||
 | 
					        .import_file("example_mutelist1.txt", ModAction::Silence);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let test_src = ModSource::from(HashMap::from([
 | 
				
			||||||
 | 
					        (String::from("example.com"), ModAction::Block),
 | 
				
			||||||
 | 
					        (String::from("example.org"), ModAction::Block),
 | 
				
			||||||
 | 
					        (String::from("example.net"), ModAction::Silence),
 | 
				
			||||||
 | 
					    ]));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert_eq!(test_src, src);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[test]
 | 
				
			||||||
 | 
					fn modmap_from_modsource() {
 | 
				
			||||||
 | 
					    let mut ml = ModMap::default();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let src1 = ModSource::from(HashMap::from([
 | 
				
			||||||
 | 
					        (String::from("example.com"), ModAction::Block),
 | 
				
			||||||
 | 
					        (String::from("example.org"), ModAction::Silence),
 | 
				
			||||||
 | 
					        (String::from("example.net"), ModAction::Block),
 | 
				
			||||||
 | 
					    ]));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let mut src2 = ModSource::default();
 | 
				
			||||||
 | 
					    src2.import_file("example_blocklist1.txt", ModAction::Block)
 | 
				
			||||||
 | 
					        .import_file("example_mutelist1.txt", ModAction::Silence);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ml.add_source(src1).add_source(src2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let test_ml = ModMap(HashMap::from([
 | 
				
			||||||
 | 
					        (String::from("example.com"), ModActionTrust::from((200, 0))),
 | 
				
			||||||
 | 
					        (
 | 
				
			||||||
 | 
					            String::from("example.org"),
 | 
				
			||||||
 | 
					            ModActionTrust::from((100, 100)),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        (
 | 
				
			||||||
 | 
					            String::from("example.net"),
 | 
				
			||||||
 | 
					            ModActionTrust::from((100, 100)),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					    ]));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert_eq!(ml, test_ml);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let src3 = ModSource::build(
 | 
				
			||||||
 | 
					        HashMap::from([
 | 
				
			||||||
 | 
					            (String::from("example.com"), ModAction::Block),
 | 
				
			||||||
 | 
					            (String::from("example.org"), ModAction::Silence),
 | 
				
			||||||
 | 
					        ]),
 | 
				
			||||||
 | 
					        200,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let src4 = ModSource::build(
 | 
				
			||||||
 | 
					        HashMap::from([
 | 
				
			||||||
 | 
					            (String::from("example.com"), ModAction::Block),
 | 
				
			||||||
 | 
					            (String::from("example.net"), ModAction::Silence),
 | 
				
			||||||
 | 
					        ]),
 | 
				
			||||||
 | 
					        50,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ml.add_source(src3).add_source(src4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let test_ml = ModMap(HashMap::from([
 | 
				
			||||||
 | 
					        (String::from("example.com"), ModActionTrust::from((450, 0))),
 | 
				
			||||||
 | 
					        (
 | 
				
			||||||
 | 
					            String::from("example.org"),
 | 
				
			||||||
 | 
					            ModActionTrust::from((100, 300)),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        (
 | 
				
			||||||
 | 
					            String::from("example.net"),
 | 
				
			||||||
 | 
					            ModActionTrust::from((100, 150)),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					    ]));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert_eq!(ml, test_ml);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[test]
 | 
				
			||||||
 | 
					fn modmap_export_txt() {
 | 
				
			||||||
 | 
					    let mut ml = ModMap::default();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let src1 = ModSource::from(HashMap::from([
 | 
				
			||||||
 | 
					        (String::from("example.com"), ModAction::Block),
 | 
				
			||||||
 | 
					        (String::from("example.org"), ModAction::Silence),
 | 
				
			||||||
 | 
					        (String::from("example.net"), ModAction::Block),
 | 
				
			||||||
 | 
					    ]));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let mut src2 = ModSource::default();
 | 
				
			||||||
 | 
					    src2.import_file("example_blocklist1.txt", ModAction::Block)
 | 
				
			||||||
 | 
					        .import_file("example_mutelist1.txt", ModAction::Silence);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let src3 = ModSource::build(
 | 
				
			||||||
 | 
					        HashMap::from([
 | 
				
			||||||
 | 
					            (String::from("example.com"), ModAction::Block),
 | 
				
			||||||
 | 
					            (String::from("example.org"), ModAction::Silence),
 | 
				
			||||||
 | 
					        ]),
 | 
				
			||||||
 | 
					        200,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let src4 = ModSource::build(
 | 
				
			||||||
 | 
					        HashMap::from([
 | 
				
			||||||
 | 
					            (String::from("example.com"), ModAction::Block),
 | 
				
			||||||
 | 
					            (String::from("example.net"), ModAction::Silence),
 | 
				
			||||||
 | 
					        ]),
 | 
				
			||||||
 | 
					        50,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ml.add_source(src1)
 | 
				
			||||||
 | 
					        .add_source(src2)
 | 
				
			||||||
 | 
					        .add_source(src3)
 | 
				
			||||||
 | 
					        .add_source(src4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let _ = ml.export_file("test_blocks.txt", "test_mutes.txt", (200, 150));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let blocks: String = fs::read_to_string("test_blocks.txt").unwrap();
 | 
				
			||||||
 | 
					    let mutes: String = fs::read_to_string("test_mutes.txt").unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert_eq!(blocks, "example.com\n");
 | 
				
			||||||
 | 
					    assert!(mutes == "example.org\nexample.net\n" || mutes == "example.net\nexample.org\n");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										1
									
								
								test_blocks.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test_blocks.txt
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					example.com
 | 
				
			||||||
							
								
								
									
										2
									
								
								test_mutes.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								test_mutes.txt
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,2 @@
 | 
				
			||||||
 | 
					example.net
 | 
				
			||||||
 | 
					example.org
 | 
				
			||||||
		Loading…
	
		Reference in a new issue