Skip to content

Commit 7b1c1f3

Browse files
authored
Merge pull request #27 from LuisLiraC/feat/tests
Create unit and integration tests
2 parents 57e4155 + 0236e43 commit 7b1c1f3

File tree

5 files changed

+252
-32
lines changed

5 files changed

+252
-32
lines changed

.github/workflows/test.yaml

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
name: Run Tests
2+
3+
on:
4+
pull_request:
5+
6+
7+
jobs:
8+
test:
9+
runs-on: ubuntu-latest
10+
name: Run Tests
11+
steps:
12+
- uses: actions/checkout@v4
13+
14+
- name: Cache cargo registry
15+
uses: actions/cache@v4
16+
with:
17+
path: ~/.cargo/registry
18+
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
19+
restore-keys: |
20+
${{ runner.os }}-cargo-registry-
21+
22+
- name: Cache cargo index
23+
uses: actions/cache@v4
24+
with:
25+
path: ~/.cargo/git
26+
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}
27+
restore-keys: |
28+
${{ runner.os }}-cargo-index-
29+
30+
- name: Cache cargo build
31+
uses: actions/cache@v4
32+
with:
33+
path: target
34+
key: ${{ runner.os }}-cargo-build-${{ hashFiles('**/Cargo.lock') }}
35+
restore-keys: |
36+
${{ runner.os }}-cargo-build-
37+
38+
- name: Run Tests
39+
run: cargo test

action.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ runs:
2020
- name: Get Binary
2121
shell: bash
2222
run: |
23-
BIN_URL=$(curl https://api.github.com/repos/LuisLiraC/git-diff/releases/tags/v1.0.0 | jq -r '.assets[0].browser_download_url')
23+
BIN_URL=$(curl https://api.github.com/repos/LuisLiraC/git-diff/releases/tags/v1.0.1 | jq -r '.assets[0].browser_download_url')
2424
curl -s -L $BIN_URL -o rust-binary.tgz
2525
tar -xzvf rust-binary.tgz
2626
mv ./Linux/git-diff ./git-diff

src/main.rs

+48-31
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@ fn main() {
1414
let args: Vec<String> = env::args().collect();
1515
let mut patterns_filters: Vec<PatternFilter> = Vec::new();
1616

17-
let mut exclude_patterns_filters: Vec<PatternFilter> = Vec::new();
18-
let mut include_patterns_filters: Vec<PatternFilter> = Vec::new();
19-
2017
for arg in args.iter() {
2118
if arg.starts_with("--patterns=") {
2219
patterns_filters = create_patterns_filters(&arg);
@@ -28,41 +25,19 @@ fn main() {
2825
return;
2926
}
3027

31-
patterns_filters.iter().for_each(|pattern_filter| {
32-
if pattern_filter.exclude {
33-
exclude_patterns_filters.push(pattern_filter.clone());
34-
} else {
35-
include_patterns_filters.push(pattern_filter.clone());
36-
}
37-
});
28+
let (include_patterns_filters, exclude_patterns_filters) = categorize_filters(patterns_filters);
3829

3930
let start = Instant::now();
4031
let changed_files = get_changed_files();
4132
let duration = start.elapsed();
4233
println!("Getting changed files done in: {:?}", duration);
4334

44-
let mut filtered_files: Vec<String> = Vec::new();
45-
4635
let start = Instant::now();
47-
for pattern in include_patterns_filters.iter() {
48-
filtered_files.extend(filter_files_by_pattern(&pattern, changed_files.clone()));
49-
}
36+
let filtered_files = filter(changed_files, include_patterns_filters, exclude_patterns_filters);
5037
let duration = start.elapsed();
5138
println!("Filtering files done in: {:?}", duration);
5239

53-
let start = Instant::now();
54-
for pattern in exclude_patterns_filters.iter() {
55-
filtered_files = filtered_files
56-
.iter()
57-
.filter(|file| !Pattern::new(&pattern.pattern).expect("Failed to create pattern").matches(file))
58-
.map(|file| file.to_string())
59-
.collect();
60-
}
61-
let duration = start.elapsed();
62-
println!("Excluding files done in: {:?}", duration);
63-
64-
println!("DIFF_FILES: {:?}", filtered_files);
65-
println!("DIFF_COUNT: {}", filtered_files.len());
40+
let count = get_count(filtered_files.clone());
6641

6742
Command::new("sh")
6843
.arg("-c")
@@ -72,7 +47,7 @@ fn main() {
7247

7348
Command::new("sh")
7449
.arg("-c")
75-
.arg(format!("echo \"DIFF_COUNT={}\" >> $GITHUB_OUTPUT", filtered_files.len()))
50+
.arg(format!("echo \"DIFF_COUNT={}\" >> $GITHUB_OUTPUT", count))
7651
.output()
7752
.expect("Failed to execute DIFF_COUNT command");
7853
}
@@ -144,15 +119,57 @@ fn get_changed_files() -> Vec<String> {
144119
changed_files
145120
}
146121

147-
fn filter_files_by_pattern(pattern_filter: &PatternFilter, files: Vec<String>) -> Vec<String> {
122+
fn filter(changed_files: Vec<String>, include_patterns_filters: Vec<PatternFilter>, exclude_patterns_filters: Vec<PatternFilter>) -> Vec<String> {
123+
let filtered_files: Vec<String> = include_patterns_filters
124+
.iter()
125+
.flat_map(|pattern| filter_files_by_pattern(pattern, &changed_files, &exclude_patterns_filters))
126+
.collect();
127+
128+
filtered_files
129+
}
130+
131+
fn filter_files_by_pattern(pattern_filter: &PatternFilter, files: &Vec<String>, exclude_patterns: &Vec<PatternFilter>) -> Vec<String> {
148132
let pattern = Pattern::new(&pattern_filter.pattern).expect("Failed to create pattern");
149133

150-
let filtered_files: Vec<String> = files
134+
let mut filtered_files: Vec<String> = files
151135
.iter()
152136
.filter(|file| pattern.matches(file))
153137
.filter(|_| pattern_filter.exclude == false)
154138
.map(|file| file.to_string())
155139
.collect();
156140

141+
for exclude_pattern in exclude_patterns.iter() {
142+
filtered_files = filtered_files
143+
.iter()
144+
.filter(|file| !Pattern::new(&exclude_pattern.pattern).expect("Failed to create pattern").matches(file))
145+
.map(|file| file.to_string())
146+
.collect();
147+
}
148+
157149
filtered_files
150+
}
151+
152+
fn get_count(filtered_files: Vec<String>) -> usize {
153+
filtered_files.len()
154+
}
155+
156+
fn categorize_filters(filters: Vec<PatternFilter>) -> (Vec<PatternFilter>, Vec<PatternFilter>) {
157+
let mut exclude_patterns_filters: Vec<PatternFilter> = Vec::new();
158+
let mut include_patterns_filters: Vec<PatternFilter> = Vec::new();
159+
160+
filters.iter().for_each(|pattern_filter| {
161+
if pattern_filter.exclude {
162+
exclude_patterns_filters.push(pattern_filter.clone());
163+
} else {
164+
include_patterns_filters.push(pattern_filter.clone());
165+
}
166+
});
167+
168+
(include_patterns_filters, exclude_patterns_filters)
169+
}
170+
171+
#[cfg(test)]
172+
mod tests {
173+
mod unit;
174+
mod integration;
158175
}

src/tests/integration.rs

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use crate::*;
2+
3+
#[cfg(test)]
4+
mod integration {
5+
use super::*;
6+
7+
#[test]
8+
fn test_filter() {
9+
let arg = "--patterns=*.rs,!*..txt";
10+
let files = vec![
11+
String::from("main.rs"),
12+
String::from("lib.rs"),
13+
String::from("test.txt"),
14+
];
15+
16+
let filters = create_patterns_filters(arg);
17+
18+
let (include_patterns_filters, exclude_patterns_filters) = categorize_filters(filters);
19+
20+
let filtered_files = filter(files, include_patterns_filters, exclude_patterns_filters);
21+
22+
let count = get_count(filtered_files.clone());
23+
24+
assert_eq!(
25+
filtered_files,
26+
vec![String::from("main.rs"), String::from("lib.rs")]
27+
);
28+
assert_eq!(count, 2);
29+
}
30+
}

src/tests/unit.rs

+134
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
use crate::*;
2+
3+
#[cfg(test)]
4+
mod unit {
5+
use super::*;
6+
7+
#[test]
8+
fn test_create_patterns_filters() {
9+
let arg = "--patterns=*.rs,!test/*.rs";
10+
let filters = create_patterns_filters(arg);
11+
assert_eq!(filters.len(), 2);
12+
assert_eq!(filters[0].pattern, "*.rs");
13+
assert_eq!(
14+
filters[0].exclude, false,
15+
"Expected 'exclude' to be false for pattern '*.rs'"
16+
);
17+
assert_eq!(filters[1].pattern, "test/*.rs");
18+
assert_eq!(filters[1].exclude, true);
19+
}
20+
21+
#[test]
22+
fn test_categorize_filters() {
23+
let filters = vec![
24+
PatternFilter {
25+
pattern: String::from("*.rs"),
26+
exclude: false,
27+
},
28+
PatternFilter {
29+
pattern: String::from("test/*.rs"),
30+
exclude: true,
31+
},
32+
];
33+
let (include_patterns_filters, exclude_patterns_filters) = categorize_filters(filters);
34+
assert_eq!(include_patterns_filters.len(), 1);
35+
assert_eq!(exclude_patterns_filters.len(), 1);
36+
assert_eq!(include_patterns_filters[0].pattern, "*.rs");
37+
assert_eq!(exclude_patterns_filters[0].pattern, "test/*.rs");
38+
}
39+
40+
#[test]
41+
fn test_filter() {
42+
let files = vec![
43+
String::from("main.rs"),
44+
String::from("lib.rs"),
45+
String::from("test.txt"),
46+
];
47+
let include_patterns_filters = vec![
48+
PatternFilter {
49+
pattern: String::from("*.rs"),
50+
exclude: false,
51+
},
52+
PatternFilter {
53+
pattern: String::from("*.txt"),
54+
exclude: false,
55+
},
56+
];
57+
let exclude_patterns_filters = vec![PatternFilter {
58+
pattern: String::from("test.txt"),
59+
exclude: true,
60+
}];
61+
let filtered_files = filter(files, include_patterns_filters, exclude_patterns_filters);
62+
assert_eq!(
63+
filtered_files,
64+
vec![String::from("main.rs"), String::from("lib.rs")]
65+
);
66+
}
67+
68+
#[test]
69+
fn test_filter_files_by_pattern() {
70+
let pattern_filter = PatternFilter {
71+
pattern: String::from("*.rs"),
72+
exclude: false,
73+
};
74+
let files = vec![
75+
String::from("main.rs"),
76+
String::from("lib.rs"),
77+
String::from("test.txt"),
78+
];
79+
let filtered = filter_files_by_pattern(&pattern_filter, &files, &Vec::new());
80+
assert_eq!(
81+
filtered,
82+
vec![String::from("main.rs"), String::from("lib.rs")]
83+
);
84+
}
85+
86+
#[test]
87+
fn test_filter_exclude_files_exclusion() {
88+
let mut filtered_files: Vec<String> = Vec::new();
89+
let mut exclude_patterns_filters: Vec<PatternFilter> = Vec::new();
90+
let mut include_patterns_filters: Vec<PatternFilter> = Vec::new();
91+
92+
include_patterns_filters.push(PatternFilter {
93+
pattern: String::from("*.rs"),
94+
exclude: false,
95+
});
96+
97+
include_patterns_filters.push(PatternFilter {
98+
pattern: String::from("*.txt"),
99+
exclude: false,
100+
});
101+
102+
exclude_patterns_filters.push(PatternFilter {
103+
pattern: String::from("test.txt"),
104+
exclude: true,
105+
});
106+
107+
let files = vec![
108+
String::from("main.rs"),
109+
String::from("lib.rs"),
110+
String::from("version.txt"),
111+
String::from("test.txt"),
112+
];
113+
114+
for pattern in include_patterns_filters.iter() {
115+
filtered_files.extend(filter_files_by_pattern(&pattern, &files, &exclude_patterns_filters));
116+
}
117+
118+
assert_eq!(
119+
filtered_files,
120+
vec![String::from("main.rs"), String::from("lib.rs"), String::from("version.txt")]
121+
);
122+
}
123+
124+
#[test]
125+
fn test_get_count() {
126+
let files = vec![
127+
String::from("main.rs"),
128+
String::from("lib.rs"),
129+
String::from("version.txt"),
130+
];
131+
let count = get_count(files);
132+
assert_eq!(count, 3);
133+
}
134+
}

0 commit comments

Comments
 (0)