semver_common/models/
change.rs1use derive_getters::Getters;
2use regex::Regex;
3use serde::{Deserialize, Serialize};
4
5use crate::models::{Alert, Commit};
6
7#[derive(Serialize, Deserialize, Clone, Debug, Getters)]
9pub struct Change {
10 priority: u32,
11 pattern: String,
12 kind: String,
13}
14
15impl PartialEq for Change {
16 fn eq(&self, other: &Self) -> bool {
17 self.pattern.as_str() == other.pattern.as_str() && self.kind == other.kind
18 }
19}
20
21impl Change {
22 pub fn check(&self, commit: &Commit) -> Result<(), Alert> {
24 let r = Regex::new(&self.pattern)?;
25 match r.is_match(commit.message()) {
26 true => Ok(()),
27 false => Err(Alert::from("Pattern did not match")),
28 }
29 }
30}
31
32#[cfg(test)]
33mod test {
34 use serde_json::{Value, json};
35
36 use crate::{Change, mock};
37
38 #[test]
39 fn test_change_new_valid() {
40 let content: Value = json!({
41 "priority": 1,
42 "pattern": "^test.*$",
43 "kind": "TEST"
44 });
45 let change: Result<Change, serde_json::Error> = serde_json::from_value(content);
46 assert_eq!(change.is_ok(), true);
47 }
48
49 #[test]
50 fn test_change_new_invalid() {
51 let content: Value = json!(["Invalid", { "JSON_KEY": 334 }]);
52 let change: Result<Change, serde_json::Error> = serde_json::from_value(content);
53 assert_eq!(change.is_ok(), false);
54 }
55
56 #[test]
57 fn test_change_check_pattern_match_one() {
58 let change = mock::change::create("^feat(\n|.)*$", "Feature", 2);
59 let commit = mock::commit::create("feat(super): the message header");
60 let check = change.check(&commit);
61 assert_eq!(check.is_ok(), true);
62 }
63
64 #[test]
65 fn test_change_check_pattern_match_two() {
66 let change = mock::change::create("^fix(\n|.)*$", "Fix", 3);
67 let commit = mock::commit::create("fix(super): the message header");
68 let check = change.check(&commit);
69 assert_eq!(check.is_ok(), true);
70 }
71
72 #[test]
73 fn test_change_check_pattern_not_match_one() {
74 let change = mock::change::create("^fix(\n|.)*$", "Fix", 3);
75 let commit = mock::commit::create("feat(super): the message header");
76 let check = change.check(&commit);
77 assert_eq!(check.is_ok(), false);
78 }
79
80 #[test]
81 fn test_change_check_pattern_not_match_two() {
82 let change = mock::change::create("^feat(\n|.)*$", "Feature", 2);
83 let commit = mock::commit::create("fix(super): the message header");
84 let check = change.check(&commit);
85 assert_eq!(check.is_ok(), false);
86 }
87}