diff --git a/src/count.rs b/src/count.rs
index b02ba1a..f1116dd 100644
--- a/src/count.rs
+++ b/src/count.rs
@@ -5,7 +5,7 @@ use std::{fs::{read_dir, ReadDir}, path::Path, result::Result as StdResult, iter
/// so to get the amount of repos, we just have to count everything
/// in `*/*/*` to get the count.
#[instrument]
-pub(crate) fn count_repositories
(repo_path: P) -> Result
+pub fn count_repositories(repo_path: P) -> Result
where
P: AsRef + std::fmt::Debug,
{
diff --git a/src/error.rs b/src/error.rs
index 42b7eaf..660b554 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -5,7 +5,7 @@ use std::fmt;
pub(crate) type Result = std::result::Result;
#[derive(Debug)]
-pub(crate) enum Error {
+pub enum Error {
Badge(String),
Client(reqwest::Error),
Git(git2::Error),
diff --git a/src/lib.rs b/src/lib.rs
index baa9c7e..6d99020 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -11,7 +11,7 @@ extern crate tracing;
mod cache;
pub mod config;
-mod count;
+pub mod count;
mod error;
mod service;
mod statics;
diff --git a/tests/count.rs b/tests/count.rs
new file mode 100644
index 0000000..709949d
--- /dev/null
+++ b/tests/count.rs
@@ -0,0 +1,66 @@
+use hoc::count::count_repositories;
+
+use tempfile::TempDir;
+
+#[test]
+fn no_repos() {
+ let repos = TempDir::new().unwrap();
+ assert_eq!(0, count_repositories(&repos).unwrap())
+}
+
+#[test]
+fn no_repos_for_provider() {
+ let repos = TempDir::new().unwrap();
+ let _provider = TempDir::new_in(&repos).unwrap();
+ assert_eq!(0, count_repositories(&repos).unwrap())
+}
+
+#[test]
+fn no_repos_for_owner() {
+ let repos = TempDir::new().unwrap();
+ let provider = TempDir::new_in(&repos).unwrap();
+ let _owner = TempDir::new_in(&provider).unwrap();
+ assert_eq!(0, count_repositories(&repos).unwrap())
+}
+
+#[test]
+fn one_repo_for_owner() {
+ let repos = TempDir::new().unwrap();
+ let provider = TempDir::new_in(&repos).unwrap();
+ let owner = TempDir::new_in(&provider).unwrap();
+ let _repo = TempDir::new_in(&owner).unwrap();
+ assert_eq!(1, count_repositories(&repos).unwrap())
+}
+
+#[test]
+fn two_repos_for_owner() {
+ let repos = TempDir::new().unwrap();
+ let provider = TempDir::new_in(&repos).unwrap();
+ let owner = TempDir::new_in(&provider).unwrap();
+ let _repo1 = TempDir::new_in(&owner).unwrap();
+ let _repo2 = TempDir::new_in(&owner).unwrap();
+ assert_eq!(2, count_repositories(&repos).unwrap())
+}
+
+#[test]
+fn two_repos_for_two_providers() {
+ let repos = TempDir::new().unwrap();
+ let provider1 = TempDir::new_in(&repos).unwrap();
+ let owner1 = TempDir::new_in(&provider1).unwrap();
+ let _repo1 = TempDir::new_in(&owner1).unwrap();
+ let provider2 = TempDir::new_in(&repos).unwrap();
+ let owner2 = TempDir::new_in(&provider2).unwrap();
+ let _repo2 = TempDir::new_in(&owner2).unwrap();
+ assert_eq!(2, count_repositories(&repos).unwrap())
+}
+
+#[test]
+fn two_subdirs_in_one_repo() {
+ let repos = TempDir::new().unwrap();
+ let provider = TempDir::new_in(&repos).unwrap();
+ let owner = TempDir::new_in(&provider).unwrap();
+ let repo = TempDir::new_in(&owner).unwrap();
+ let _subdir1 = TempDir::new_in(&repo).unwrap();
+ let _subdir2 = TempDir::new_in(&repo).unwrap();
+ assert_eq!(1, count_repositories(&repos).unwrap())
+}