Skip to main content

semver_common/models/
change.rs

1use derive_getters::Getters;
2use regex::Regex;
3use serde::{Deserialize, Serialize};
4
5use crate::models::{Alert, Commit};
6
7/// A pattern that represents a type of change based on a commit message.
8#[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    /// Checks a commit to see if it matches this change pattern.
23    pub fn check(&self, commit: &Commit) -> Result<(), Alert> {
24        let r = Regex::new(&self.pattern)?;
25        match r.is_match(commit.msg()) {
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}