co-author 0.1.3

Co-Author your git commits from the command line
use super::provider::LoadMode;
use crate::authors::author::AuthorsProvider;
use crate::authors::csv::provider::CSVProvider;
use crate::common::fs::file_reader::MockReader;
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};

#[test]
fn all_authors_in_file() {
	let provider = csv_provider_with(vec![
		"a,Name Surname,someone@users.noreply.github.com".to_string(),
		"b,username,something@gmail.com".to_string(),
	]);

	let retrieved_authors = provider.all();

	assert_eq!(retrieved_authors.len(), 2);
}

#[test]
fn only_author_matching_an_alias() {
	let provider = csv_provider_with(vec![
		"a,Name Surname,someone@users.noreply.github.com".to_string(),
		"b,username,something@gmail.com".to_string(),
	]);

	let retrieved_authors = provider.find_by_aliases(&["a".to_string()]);

	assert_eq!(retrieved_authors.len(), 1);
}

#[test]
fn all_authors_matching_an_alias() {
	let provider = csv_provider_with(vec![
		"a,Name Surname,someone@users.noreply.github.com".to_string(),
		"b,username,something@gmail.com".to_string(),
		"b,username2,something2@gmail.com".to_string(),
	]);

	let retrieved_authors = provider.find_by_aliases(&["b".to_string()]);

	assert_eq!(retrieved_authors.len(), 2);
}

#[test]
fn no_author_when_alias_doesnt_match() {
	let provider = csv_provider_with(vec!["a,Name Surname,someone@users.noreply.github.com".to_string()]);

	let retrieved_authors = provider.find_by_aliases(&["z".to_string()]);

	assert_eq!(retrieved_authors.len(), 0);
}

#[test]
fn only_author_matching_a_hash() {
	let provider = csv_provider_with(vec![
		"a,Name Surname,someone@users.noreply.github.com".to_string(),
		"a,Another Name Surname,someone@users.noreply.github.com".to_string(),
		"b,username,something@gmail.com".to_string(),
	]);

	let retrieved_authors = provider.find_by_hashes(&[hash_of("aName Surname")]);

	assert_eq!(retrieved_authors.len(), 1);
}

#[test]
fn no_author_when_hash_doesnt_match() {
	let provider = csv_provider_with(vec!["a,Name Surname,someone@users.noreply.github.com".to_string()]);

	let retrieved_authors = provider.find_by_hashes(&[hash_of("zIrrelevant")]);

	assert_eq!(retrieved_authors.len(), 0);
}

fn csv_provider_with(authors: Vec<String>) -> CSVProvider {
	let mut mock_reader = MockReader::new();
	mock_reader
		.expect_read_non_empty_lines()
		.times(1)
		.returning(move |_| Ok(authors.clone()));
	CSVProvider::load(&LoadMode::FromCwd {
		file_reader: &mock_reader,
	})
	.expect("Could not setup AuthorsProvider for test")
}

fn hash_of(str: &str) -> u64 {
	let mut hasher = DefaultHasher::new();
	str.hash(&mut hasher);
	hasher.finish()
}