-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathvalidate_files_test.rs
More file actions
144 lines (119 loc) · 4.15 KB
/
validate_files_test.rs
File metadata and controls
144 lines (119 loc) · 4.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
use assert_cmd::prelude::*;
use predicates::prelude::*;
use std::{error::Error, process::Command};
mod common;
use common::*;
#[test]
fn test_validate_with_owned_files() -> Result<(), Box<dyn Error>> {
run_codeowners(
"valid_project",
&["validate", "ruby/app/models/payroll.rb", "ruby/app/models/bank_account.rb"],
true,
OutputStream::Stdout,
predicate::eq(""),
)?;
Ok(())
}
#[test]
fn test_validate_with_unowned_file() -> Result<(), Box<dyn Error>> {
run_codeowners(
"valid_project",
&["validate", "ruby/app/unowned.rb"],
false,
OutputStream::Stdout,
predicate::str::contains("ruby/app/unowned.rb").and(predicate::str::contains("Unowned")),
)?;
Ok(())
}
#[test]
fn test_validate_with_mixed_files() -> Result<(), Box<dyn Error>> {
run_codeowners(
"valid_project",
&["validate", "ruby/app/models/payroll.rb", "ruby/app/unowned.rb"],
false,
OutputStream::Stdout,
predicate::str::contains("ruby/app/unowned.rb").and(predicate::str::contains("Unowned")),
)?;
Ok(())
}
#[test]
fn test_validate_with_no_files() -> Result<(), Box<dyn Error>> {
// Existing behavior - validates entire project
run_codeowners("valid_project", &["validate"], true, OutputStream::Stdout, predicate::eq(""))?;
Ok(())
}
#[test]
fn test_generate_and_validate_with_owned_files() -> Result<(), Box<dyn Error>> {
let fixture_root = std::path::Path::new("tests/fixtures/valid_project");
let temp_dir = setup_fixture_repo(fixture_root);
let project_root = temp_dir.path();
git_add_all_files(project_root);
let codeowners_path = project_root.join("tmp/CODEOWNERS");
Command::cargo_bin("codeowners")?
.arg("--project-root")
.arg(project_root)
.arg("--codeowners-file-path")
.arg(&codeowners_path)
.arg("--no-cache")
.arg("generate-and-validate")
.arg("ruby/app/models/payroll.rb")
.arg("ruby/app/models/bank_account.rb")
.assert()
.success();
Ok(())
}
#[test]
fn test_generate_and_validate_with_unowned_file() -> Result<(), Box<dyn Error>> {
let fixture_root = std::path::Path::new("tests/fixtures/valid_project");
let temp_dir = setup_fixture_repo(fixture_root);
let project_root = temp_dir.path();
git_add_all_files(project_root);
let codeowners_path = project_root.join("tmp/CODEOWNERS");
Command::cargo_bin("codeowners")?
.arg("--project-root")
.arg(project_root)
.arg("--codeowners-file-path")
.arg(&codeowners_path)
.arg("--no-cache")
.arg("generate-and-validate")
.arg("ruby/app/unowned.rb")
.assert()
.failure()
.stdout(predicate::str::contains("ruby/app/unowned.rb"))
.stdout(predicate::str::contains("Unowned"));
Ok(())
}
#[test]
fn test_validate_with_absolute_path() -> Result<(), Box<dyn Error>> {
let fixture_root = std::path::Path::new("tests/fixtures/valid_project");
let temp_dir = setup_fixture_repo(fixture_root);
let project_root = temp_dir.path();
git_add_all_files(project_root);
let file_absolute_path = project_root.join("ruby/app/models/payroll.rb").canonicalize()?;
Command::cargo_bin("codeowners")?
.arg("--project-root")
.arg(project_root)
.arg("--no-cache")
.arg("validate")
.arg(file_absolute_path.to_str().unwrap())
.assert()
.success();
Ok(())
}
#[test]
fn test_validate_only_checks_codeowners_file() -> Result<(), Box<dyn Error>> {
// This test demonstrates that `validate` with files only checks the CODEOWNERS file
// It does NOT check file annotations or other ownership sources
//
// If a file has an annotation but is missing from CODEOWNERS, `validate` will report it as unowned
// This is why `generate-and-validate` should be used for accuracy
// ruby/app/models/bank_account.rb has @team Payments annotation and is in CODEOWNERS
run_codeowners(
"valid_project",
&["validate", "ruby/app/models/bank_account.rb"],
true,
OutputStream::Stdout,
predicate::eq(""),
)?;
Ok(())
}