#[test]
fn test_get_breaking_changes_since_returns_empty() {
let changes = get_breaking_changes_since("1.0.0");
assert!(changes.is_empty());
}
#[test]
fn test_get_breaking_changes_since_any_version() {
let changes = get_breaking_changes_since("0.0.1");
assert!(changes.is_empty());
}
#[test]
fn test_get_changelog_entries_returns_entries() {
let entries = get_changelog_entries("1.0.0", "2.0.0");
assert!(!entries.is_empty());
}
#[test]
fn test_get_changelog_entries_contain_expected_features() {
let entries = get_changelog_entries("1.0.0", PMAT_VERSION);
let has_comply = entries.iter().any(|e| e.description.contains("comply"));
assert!(has_comply);
}
#[test]
fn test_changelog_entry_breaking_flag() {
let entries = get_changelog_entries("1.0.0", "2.0.0");
let breaking_count = entries.iter().filter(|e| e.breaking).count();
assert_eq!(breaking_count, 0);
}
#[test]
fn test_load_or_create_config_creates_new() {
let temp = create_temp_project();
let config =
load_or_create_project_config(temp.path()).expect("Failed to load/create config");
assert_eq!(config.pmat.version, PMAT_VERSION);
assert!(temp.path().join(".pmat").join("project.toml").exists());
}
#[test]
fn test_load_or_create_config_loads_existing() {
let temp = create_pmat_project("1.0.0");
let config = load_or_create_project_config(temp.path()).expect("Failed to load config");
assert_eq!(config.pmat.version, "1.0.0");
}
#[test]
fn test_load_or_create_config_invalid_toml() {
let temp = create_temp_project();
let pmat_dir = temp.path().join(".pmat");
fs::create_dir_all(&pmat_dir).expect("Failed to create .pmat");
fs::write(pmat_dir.join("project.toml"), "invalid { toml").expect("Failed to write");
let result = load_or_create_project_config(temp.path());
assert!(result.is_err());
}
#[test]
fn test_update_last_check_timestamp() {
let temp = create_pmat_project(PMAT_VERSION);
let result = update_last_check_timestamp(temp.path());
assert!(result.is_ok());
let config = load_or_create_project_config(temp.path()).expect("Failed to load config");
assert!(config.pmat.last_compliance_check.is_some());
}
#[test]
fn test_update_last_check_timestamp_no_config() {
let temp = create_temp_project();
let result = update_last_check_timestamp(temp.path());
assert!(result.is_ok());
}
#[test]
fn test_migrate_project_version_dry_run() {
let temp = create_pmat_project("1.0.0");
let result = migrate_project_version(temp.path(), "2.0.0", true);
assert!(result.is_ok());
assert!(result.unwrap());
let config = load_or_create_project_config(temp.path()).expect("Failed to load config");
assert_eq!(config.pmat.version, "1.0.0");
}
#[test]
fn test_migrate_project_version_actual() {
let temp = create_pmat_project("1.0.0");
let result = migrate_project_version(temp.path(), "2.0.0", false);
assert!(result.is_ok());
assert!(result.unwrap());
let config = load_or_create_project_config(temp.path()).expect("Failed to load config");
assert_eq!(config.pmat.version, "2.0.0");
}
#[test]
fn test_migrate_project_version_same_version() {
let temp = create_pmat_project("1.0.0");
let result = migrate_project_version(temp.path(), "1.0.0", false);
assert!(result.is_ok());
assert!(!result.unwrap()); }
#[test]
fn test_migrate_gitignore_no_file() {
let temp = create_temp_project();
let result = migrate_gitignore(temp.path(), false);
assert!(result.is_ok());
assert!(!result.unwrap());
}
#[test]
fn test_migrate_gitignore_adds_entries() {
let temp = create_temp_project();
fs::write(temp.path().join(".gitignore"), "target/\n").expect("Failed to write gitignore");
let result = migrate_gitignore(temp.path(), false);
assert!(result.is_ok());
assert!(result.unwrap());
let content = fs::read_to_string(temp.path().join(".gitignore")).expect("Failed to read");
assert!(content.contains(".pmat/backup/"));
assert!(content.contains(".pmat-qa/"));
}
#[test]
fn test_migrate_gitignore_already_has_entries() {
let temp = create_temp_project();
fs::write(
temp.path().join(".gitignore"),
"target/\n.pmat/backup/\n.pmat-qa/\n",
)
.expect("Failed to write gitignore");
let result = migrate_gitignore(temp.path(), false);
assert!(result.is_ok());
assert!(!result.unwrap()); }
#[test]
fn test_migrate_gitignore_dry_run() {
let temp = create_temp_project();
fs::write(temp.path().join(".gitignore"), "target/\n").expect("Failed to write gitignore");
let result = migrate_gitignore(temp.path(), true);
assert!(result.is_ok());
assert!(result.unwrap());
let content = fs::read_to_string(temp.path().join(".gitignore")).expect("Failed to read");
assert!(!content.contains(".pmat/backup/"));
}
#[test]
fn test_migrate_gitignore_no_trailing_newline() {
let temp = create_temp_project();
fs::write(temp.path().join(".gitignore"), "target/").expect("Failed to write gitignore");
let result = migrate_gitignore(temp.path(), false);
assert!(result.is_ok());
let content = fs::read_to_string(temp.path().join(".gitignore")).expect("Failed to read");
assert!(content.contains("# PMAT"));
}
#[test]
fn test_update_project_config_updates_to_current() {
let temp = create_pmat_project("1.0.0");
let result = update_project_config(temp.path(), false);
assert!(result.is_ok());
let config = load_or_create_project_config(temp.path()).expect("Failed to load config");
assert_eq!(config.pmat.version, PMAT_VERSION);
}
#[test]
fn test_update_project_config_dry_run() {
let temp = create_pmat_project("1.0.0");
let result = update_project_config(temp.path(), true);
assert!(result.is_ok());
let config = load_or_create_project_config(temp.path()).expect("Failed to load config");
assert_eq!(config.pmat.version, "1.0.0"); }
#[test]
fn test_print_compliance_text_compliant() {
let report = ComplianceReport {
project_version: PMAT_VERSION.to_string(),
current_version: PMAT_VERSION.to_string(),
is_compliant: true,
versions_behind: 0,
checks: vec![ComplianceCheck {
name: "Test".to_string(),
status: CheckStatus::Pass,
message: "OK".to_string(),
severity: Severity::Info,
}],
breaking_changes: vec![],
recommendations: vec![],
timestamp: Utc::now(),
};
print_compliance_text(&report);
}
#[test]
fn test_print_compliance_text_non_compliant() {
let report = ComplianceReport {
project_version: "1.0.0".to_string(),
current_version: PMAT_VERSION.to_string(),
is_compliant: false,
versions_behind: 10,
checks: vec![ComplianceCheck {
name: "Version".to_string(),
status: CheckStatus::Fail,
message: "Outdated".to_string(),
severity: Severity::Error,
}],
breaking_changes: vec![],
recommendations: vec!["Update PMAT".to_string()],
timestamp: Utc::now(),
};
print_compliance_text(&report);
}