use crate::fingerprint::build_corporate_fingerprint;
use tokmd_git::GitCommit;
fn commit(author: &str) -> GitCommit {
GitCommit {
timestamp: 0,
author: author.to_string(),
hash: None,
subject: String::new(),
files: vec![],
}
}
#[test]
fn empty_commits_produce_empty_fingerprint() {
let fp = build_corporate_fingerprint(&[]);
assert!(fp.domains.is_empty());
}
#[test]
fn single_corporate_author() {
let commits = vec![commit("alice@acme.com")];
let fp = build_corporate_fingerprint(&commits);
assert_eq!(fp.domains.len(), 1);
assert_eq!(fp.domains[0].domain, "acme.com");
assert_eq!(fp.domains[0].commits, 1);
assert!((fp.domains[0].pct - 1.0).abs() < f32::EPSILON);
}
#[test]
fn single_public_email_author() {
let commits = vec![commit("alice@gmail.com")];
let fp = build_corporate_fingerprint(&commits);
assert_eq!(fp.domains.len(), 1);
assert_eq!(fp.domains[0].domain, "public-email");
assert_eq!(fp.domains[0].commits, 1);
}
#[test]
fn all_public_providers_collapse_into_single_bucket() {
let commits = vec![
commit("a@gmail.com"),
commit("b@yahoo.com"),
commit("c@outlook.com"),
commit("d@hotmail.com"),
commit("e@icloud.com"),
commit("f@proton.me"),
commit("g@protonmail.com"),
];
let fp = build_corporate_fingerprint(&commits);
assert_eq!(fp.domains.len(), 1);
assert_eq!(fp.domains[0].domain, "public-email");
assert_eq!(fp.domains[0].commits, 7);
}
#[test]
fn multiple_corporate_domains_sorted_by_commit_count() {
let commits = vec![
commit("a@bigcorp.io"),
commit("b@bigcorp.io"),
commit("c@bigcorp.io"),
commit("d@startup.dev"),
];
let fp = build_corporate_fingerprint(&commits);
assert_eq!(fp.domains.len(), 2);
assert_eq!(fp.domains[0].domain, "bigcorp.io");
assert_eq!(fp.domains[0].commits, 3);
assert_eq!(fp.domains[1].domain, "startup.dev");
assert_eq!(fp.domains[1].commits, 1);
}
#[test]
fn tie_breaking_by_domain_name() {
let commits = vec![commit("a@zebra.com"), commit("b@alpha.com")];
let fp = build_corporate_fingerprint(&commits);
assert_eq!(fp.domains[0].domain, "alpha.com");
assert_eq!(fp.domains[1].domain, "zebra.com");
}
#[test]
fn mixed_corporate_and_public_domains() {
let commits = vec![
commit("a@acme.com"),
commit("b@acme.com"),
commit("c@gmail.com"),
commit("d@yahoo.com"),
];
let fp = build_corporate_fingerprint(&commits);
assert_eq!(fp.domains.len(), 2);
assert_eq!(fp.domains[0].domain, "acme.com");
assert_eq!(fp.domains[0].commits, 2);
assert_eq!(fp.domains[1].domain, "public-email");
assert_eq!(fp.domains[1].commits, 2);
}
#[test]
fn percentages_sum_to_approximately_one() {
let commits = vec![
commit("a@foo.com"),
commit("b@foo.com"),
commit("c@bar.com"),
commit("d@gmail.com"),
];
let fp = build_corporate_fingerprint(&commits);
let total_pct: f32 = fp.domains.iter().map(|d| d.pct).sum();
assert!((total_pct - 1.0).abs() < 0.01);
}
#[test]
fn percentage_values_are_correct() {
let commits = vec![
commit("a@acme.com"),
commit("b@acme.com"),
commit("c@acme.com"),
commit("d@startup.dev"),
];
let fp = build_corporate_fingerprint(&commits);
assert!((fp.domains[0].pct - 0.75).abs() < f32::EPSILON);
assert!((fp.domains[1].pct - 0.25).abs() < f32::EPSILON);
}
#[test]
fn localhost_is_ignored() {
let commits = vec![commit("root@localhost")];
let fp = build_corporate_fingerprint(&commits);
assert!(fp.domains.is_empty());
}
#[test]
fn example_com_is_ignored() {
let commits = vec![commit("test@example.com")];
let fp = build_corporate_fingerprint(&commits);
assert!(fp.domains.is_empty());
}
#[test]
fn noreply_github_is_ignored() {
let commits = vec![commit("user@users.noreply.github.com")];
let fp = build_corporate_fingerprint(&commits);
assert!(fp.domains.is_empty());
}
#[test]
fn ignored_domains_do_not_affect_percentages() {
let commits = vec![commit("a@acme.com"), commit("bot@users.noreply.github.com")];
let fp = build_corporate_fingerprint(&commits);
assert_eq!(fp.domains.len(), 1);
assert_eq!(fp.domains[0].domain, "acme.com");
assert!((fp.domains[0].pct - 1.0).abs() < f32::EPSILON);
}
#[test]
fn no_at_sign_is_skipped() {
let commits = vec![commit("noatsign")];
let fp = build_corporate_fingerprint(&commits);
assert!(fp.domains.is_empty());
}
#[test]
fn multiple_at_signs_are_skipped() {
let commits = vec![commit("bad@@address.com")];
let fp = build_corporate_fingerprint(&commits);
assert!(fp.domains.is_empty());
}
#[test]
fn empty_author_string_is_skipped() {
let commits = vec![commit("")];
let fp = build_corporate_fingerprint(&commits);
assert!(fp.domains.is_empty());
}
#[test]
fn domain_case_is_normalized() {
let commits = vec![
commit("a@ACME.COM"),
commit("b@Acme.Com"),
commit("c@acme.com"),
];
let fp = build_corporate_fingerprint(&commits);
assert_eq!(fp.domains.len(), 1);
assert_eq!(fp.domains[0].domain, "acme.com");
assert_eq!(fp.domains[0].commits, 3);
}
#[test]
fn public_domain_case_insensitive() {
let commits = vec![commit("user@GMAIL.COM")];
let fp = build_corporate_fingerprint(&commits);
assert_eq!(fp.domains.len(), 1);
assert_eq!(fp.domains[0].domain, "public-email");
}
#[test]
fn handles_large_commit_set() {
let commits: Vec<GitCommit> = (0..1000)
.map(|i| commit(&format!("dev{}@company{}.com", i, i % 10)))
.collect();
let fp = build_corporate_fingerprint(&commits);
assert_eq!(fp.domains.len(), 10);
let total: u32 = fp.domains.iter().map(|d| d.commits).sum();
assert_eq!(total, 1000);
}