From 2e374d317a1870ee6331484f0429f5faa6b3511b Mon Sep 17 00:00:00 2001 From: Paul Campbell Date: Fri, 5 Jul 2024 19:20:11 +0100 Subject: [PATCH] refactor: split git::repository::open::tests module --- crates/git/src/repository/open/tests.rs | 454 ------------------ .../src/repository/open/tests/commit_log.rs | 66 +++ crates/git/src/repository/open/tests/fetch.rs | 11 + .../open/tests/find_default_remote.rs | 17 + .../src/repository/open/tests/forge_config.rs | 102 ++++ crates/git/src/repository/open/tests/mod.rs | 21 + .../src/repository/open/tests/read_file.rs | 47 ++ .../src/repository/open/tests/repo_config.rs | 50 ++ .../open/tests/server_repo_config.rs | 84 ++++ 9 files changed, 398 insertions(+), 454 deletions(-) delete mode 100644 crates/git/src/repository/open/tests.rs create mode 100644 crates/git/src/repository/open/tests/commit_log.rs create mode 100644 crates/git/src/repository/open/tests/fetch.rs create mode 100644 crates/git/src/repository/open/tests/find_default_remote.rs create mode 100644 crates/git/src/repository/open/tests/forge_config.rs create mode 100644 crates/git/src/repository/open/tests/mod.rs create mode 100644 crates/git/src/repository/open/tests/read_file.rs create mode 100644 crates/git/src/repository/open/tests/repo_config.rs create mode 100644 crates/git/src/repository/open/tests/server_repo_config.rs diff --git a/crates/git/src/repository/open/tests.rs b/crates/git/src/repository/open/tests.rs deleted file mode 100644 index 47ee3768..00000000 --- a/crates/git/src/repository/open/tests.rs +++ /dev/null @@ -1,454 +0,0 @@ -// -use crate as git; -use crate::repository::RepositoryLike as _; -use git::tests::given; -use git_next_config as config; - -use assert2::let_assert; -type TestResult = Result<(), Box>; - -mod server_repo_config { - use super::*; - use std::path::PathBuf; - - use assert2::let_assert; - - use crate::tests::given; - - #[test] - fn should_not_return_repo_config_when_no_branches() { - let main = None; - let next = None; - let dev = None; - let src = - config::ServerRepoConfig::new(given::a_name(), given::a_name(), None, main, next, dev); - - let_assert!(None = src.repo_config()); - } - - #[test] - fn should_return_repo_config_when_branches() { - let main = given::a_name(); - let next = given::a_name(); - let dev = given::a_name(); - let src = config::ServerRepoConfig::new( - given::a_name(), - given::a_name(), - None, - Some(main.clone()), - Some(next.clone()), - Some(dev.clone()), - ); - - let_assert!(Some(rc) = src.repo_config()); - assert_eq!( - rc, - config::RepoConfig::new( - config::RepoBranches::new(main, next, dev), - config::RepoConfigSource::Server - ) - ); - } - - #[test] - fn should_return_repo() { - let repo_path = given::a_name(); - let src = config::ServerRepoConfig::new( - repo_path.clone(), - given::a_name(), - None, - Some(given::a_name()), - Some(given::a_name()), - Some(given::a_name()), - ); - - assert_eq!(src.repo(), config::RepoPath::new(repo_path)); - } - - #[test] - fn should_return_branch() { - let branch = given::a_name(); - let src = config::ServerRepoConfig::new( - given::a_name(), - branch.clone(), - None, - Some(given::a_name()), - Some(given::a_name()), - Some(given::a_name()), - ); - - assert_eq!(src.branch(), config::BranchName::new(branch)); - } - - #[test] - fn should_return_gitdir() { - let gitdir = given::a_name(); - let src = config::ServerRepoConfig::new( - given::a_name(), - given::a_name(), - Some(gitdir.clone().into()), - Some(given::a_name()), - Some(given::a_name()), - Some(given::a_name()), - ); - - assert_eq!( - src.gitdir(), - Some(config::GitDir::new(PathBuf::default().join(gitdir))) - ); - } -} - -mod repo_config { - - use super::*; - - #[test] - fn should_parse_toml() -> TestResult { - let main = given::a_name(); - let next = given::a_name(); - let dev = given::a_name(); - let toml = format!( - r#" - [branches] - main = "{main}" - next = "{next}" - dev = "{dev}" - "# - ); - - let rc = config::RepoConfig::parse(toml.as_str())?; - - assert_eq!( - rc, - config::RepoConfig::new( - config::RepoBranches::new(main, next, dev), - config::RepoConfigSource::Repo // reading from repo is the default - ) - ); - - Ok(()) - } - #[test] - fn should_return_branches() { - let main = given::a_name(); - let next = given::a_name(); - let dev = given::a_name(); - let branches = config::RepoBranches::new(main, next, dev); - let repo_config = config::RepoConfig::new(branches.clone(), config::RepoConfigSource::Repo); - - assert_eq!(repo_config.branches(), &branches); - } - #[test] - fn should_return_source() { - let main = given::a_name(); - let next = given::a_name(); - let dev = given::a_name(); - let repo_config = config::RepoConfig::new( - config::RepoBranches::new(main, next, dev), - config::RepoConfigSource::Repo, - ); - - assert_eq!(repo_config.source(), config::RepoConfigSource::Repo); - } -} - -mod forge_config { - use super::*; - use std::collections::BTreeMap; - - use secrecy::ExposeSecret; - - use crate::tests::given; - - #[test] - fn should_return_repos() { - let forge_type = config::ForgeType::MockForge; - let hostname = given::a_name(); - let user = given::a_name(); - let token = given::a_name(); - // alphabetical order by key - let red_name = format!("a-{}", given::a_name()); - let blue_name = format!("b-{}", given::a_name()); - let red = config::ServerRepoConfig::new( - red_name.clone(), - given::a_name(), - None, - None, - None, - None, - ); - let blue = config::ServerRepoConfig::new( - blue_name.clone(), - given::a_name(), - None, - None, - None, - None, - ); - let mut repos = BTreeMap::new(); - repos.insert(red_name.clone(), red.clone()); - repos.insert(blue_name.clone(), blue.clone()); - let fc = config::ForgeConfig::new(forge_type, hostname, user, token, repos); - - let returned_repos = fc.repos().collect::>(); - - assert_eq!( - returned_repos, - vec![ - // alphabetical order by key - (config::RepoAlias::new(red_name.as_str()), &red), - (config::RepoAlias::new(blue_name.as_str()), &blue), - ] - ); - } - - #[test] - fn should_return_forge_type() { - let forge_type = config::ForgeType::MockForge; - let hostname = given::a_name(); - let user = given::a_name(); - let token = given::a_name(); - let repos = BTreeMap::new(); - let fc = config::ForgeConfig::new(forge_type, hostname, user, token, repos); - - assert_eq!(fc.forge_type(), config::ForgeType::MockForge); - } - - #[test] - fn should_return_hostname() { - let forge_type = config::ForgeType::MockForge; - let hostname = given::a_name(); - let user = given::a_name(); - let token = given::a_name(); - let repos = BTreeMap::new(); - let fc = config::ForgeConfig::new(forge_type, hostname.clone(), user, token, repos); - - assert_eq!(fc.hostname(), config::Hostname::new(hostname)); - } - - #[test] - fn should_return_user() { - let forge_type = config::ForgeType::MockForge; - let hostname = given::a_name(); - let user = given::a_name(); - let token = given::a_name(); - let repos = BTreeMap::new(); - let fc = config::ForgeConfig::new(forge_type, hostname, user.clone(), token, repos); - - assert_eq!(fc.user(), config::User::new(user)); - } - - #[test] - fn should_return_token() { - let forge_type = config::ForgeType::MockForge; - let hostname = given::a_name(); - let user = given::a_name(); - let token = given::a_name(); - let repos = BTreeMap::new(); - let fc = config::ForgeConfig::new(forge_type, hostname, user, token.clone(), repos); - - assert_eq!(fc.token().expose_secret(), token.as_str()); - } - - #[test] - fn should_return_repo() { - let forge_type = config::ForgeType::MockForge; - let hostname = given::a_name(); - let user = given::a_name(); - let token = given::a_name(); - let red_name = given::a_name(); - let blue_name = given::a_name(); - let red = config::ServerRepoConfig::new( - red_name.clone(), - given::a_name(), - None, - None, - None, - None, - ); - let blue = config::ServerRepoConfig::new( - blue_name.clone(), - given::a_name(), - None, - None, - None, - None, - ); - - let mut repos = BTreeMap::new(); - repos.insert(red_name.clone(), red.clone()); - repos.insert(blue_name, blue); - let fc = config::ForgeConfig::new(forge_type, hostname, user, token, repos); - - let returned_repo = fc.get_repo(red_name.as_str()); - - assert_eq!(returned_repo, Some(&red),); - } -} - -mod find_default_remote { - use super::*; - - use assert2::let_assert; - - #[test] - fn should_find_default_push_remote() { - // uses the current repo - let_assert!(Ok(cwd) = std::env::current_dir()); - let gitdir = config::GitDir::from(cwd.join("../..")); // from ./crate/git directory to the project rook - let_assert!(Ok(repo) = crate::repository::real().open(&gitdir)); - let_assert!(Some(remote) = repo.find_default_remote(crate::repository::Direction::Push)); - assert_eq!( - remote, - git::GitRemote::new( - config::Hostname::new("git.kemitix.net"), - config::RepoPath::new("kemitix/git-next".to_string()) - ) - ) - } -} - -mod fetch { - use assert2::let_assert; - use git_next_config::GitDir; - - #[test] - #[ignore] // requires authentication to the server - which the CI doesn't have - fn should_fetch_from_repo() { - // uses the current repo and fetches from the remote server - let_assert!(Ok(cwd) = std::env::current_dir()); - let gitdir = GitDir::from(cwd.join("../..")); - let_assert!(Ok(repo) = crate::repository::real().open(&gitdir)); - let_assert!(Ok(_) = repo.fetch()); - } -} - -mod commit_log { - use git::tests::given; - - use crate::tests::then; - - use super::*; - - #[test] - // assumes running in the git-next repo which should have main, next and dev as remote branches - fn should_return_single_item_in_commit_log_when_not_searching() -> TestResult { - let_assert!(Ok(fs) = kxio::fs::temp()); - let gitdir: config::GitDir = fs.base().to_path_buf().into(); - let test_repository = git::repository::test(fs.clone()); - let_assert!(Ok(open_repository) = test_repository.open(&gitdir)); - let repo_config = &given::a_repo_config(); - let branches = repo_config.branches(); - then::create_a_commit_on_branch(&fs, &gitdir, &branches.main())?; - then::create_a_commit_on_branch(&fs, &gitdir, &branches.main())?; - let_assert!(Ok(result) = open_repository.commit_log(&branches.main(), &[])); - assert_eq!(result.len(), 1); - Ok(()) - } - - #[test] - // assumes running in the git-next repo which should have main, next and dev as remote branches - fn should_return_capacity_50_in_commit_log_when_searching_for_garbage() -> TestResult { - let_assert!(Ok(fs) = kxio::fs::temp()); - let branch_name = given::a_branch_name(); - let gitdir: config::GitDir = fs.base().to_path_buf().into(); - let test_repository = git::repository::test(fs.clone()); - let_assert!(Ok(open_repository) = test_repository.open(&gitdir)); - for _ in [0; 60] { - // create 60 commits - then::create_a_commit_on_branch(&fs, &gitdir, &branch_name)?; - } - let_assert!(Ok(result) = open_repository.commit_log(&branch_name, &[given::a_commit()])); - assert_eq!(result.len(), 50); - Ok(()) - } - - #[test] - // assumes running in the git-next repo which should have main, next and dev as remote branches - fn should_return_5_in_commit_log_when_searching_for_5th_item() -> TestResult { - let_assert!(Ok(fs) = kxio::fs::temp(), "create temp directory"); - let branch_name = given::a_branch_name(); - let gitdir: config::GitDir = fs.base().to_path_buf().into(); - let test_repository = git::repository::test(fs.clone()); - let_assert!( - Ok(open_repository) = test_repository.open(&gitdir), - "open repository" - ); - for _ in [0; 10] { - then::create_a_commit_on_branch(&fs, &gitdir, &branch_name)?; - } - // search to garbage to get all 10 items - let_assert!( - Ok(long_list) = open_repository.commit_log(&branch_name, &[given::a_commit()]), - "get commit_log" - ); - // pick the 5th item - let search = &long_list[4]; // zero-based - // search for the 25th item - let_assert!( - Ok(result) = open_repository.commit_log(&branch_name, &[search.clone()]), - "get commit log" - ); - // returns - assert_eq!(result.len(), 5); - - Ok(()) - } -} - -mod read_file { - - use git::tests::given; - use git::tests::then; - - type TestResult = Result<(), Box>; - - use super::*; - - #[test] - // assumes running in the git-next repo which should have main, next and dev as remote branches - fn should_return_file() -> TestResult { - let_assert!(Ok(fs) = kxio::fs::temp()); - let repo_config = given::a_repo_config(); - let file_name = given::a_pathbuf(); - let contents = given::a_name(); - let gitdir: config::GitDir = fs.base().to_path_buf().into(); - - let test_repository = git::repository::test(fs.clone()); - let_assert!(Ok(open_repository) = test_repository.open(&gitdir)); - then::commit_named_file_to_branch( - &file_name, - &contents, - &fs, - &gitdir, - &repo_config.branches().main(), - )?; - // then::create_a_commit_on_branch(&fs, &gitdir, &repo_config.branches().main())?; - let_assert!( - Ok(result) = open_repository.read_file(&repo_config.branches().main(), &file_name), - "read file" - ); - assert_eq!(result, contents); - Ok(()) - } - - #[test] - // assumes running in the git-next repo which should have main, next and dev as remote branches - fn should_error_on_missing_file() -> TestResult { - let_assert!(Ok(fs) = kxio::fs::temp()); - let gitdir: config::GitDir = fs.base().to_path_buf().into(); - let test_repository = git::repository::test(fs.clone()); - let_assert!(Ok(open_repository) = test_repository.open(&gitdir)); - let repo_config = &given::a_repo_config(); - let branches = repo_config.branches(); - then::create_a_commit_on_branch(&fs, &gitdir, &branches.dev())?; - let_assert!( - Err(err) = open_repository.read_file(&branches.dev(), &given::a_pathbuf()), - "read file" - ); - eprintln!("err: {err:#?}"); - assert!(matches!(err, git::file::Error::FileNotFound)); - Ok(()) - } -} diff --git a/crates/git/src/repository/open/tests/commit_log.rs b/crates/git/src/repository/open/tests/commit_log.rs new file mode 100644 index 00000000..55070442 --- /dev/null +++ b/crates/git/src/repository/open/tests/commit_log.rs @@ -0,0 +1,66 @@ +use super::*; + +#[test] +// assumes running in the git-next repo which should have main, next and dev as remote branches +fn should_return_single_item_in_commit_log_when_not_searching() -> TestResult { + let_assert!(Ok(fs) = kxio::fs::temp()); + let gitdir: config::GitDir = fs.base().to_path_buf().into(); + let test_repository = git::repository::test(fs.clone()); + let_assert!(Ok(open_repository) = test_repository.open(&gitdir)); + let repo_config = &given::a_repo_config(); + let branches = repo_config.branches(); + then::create_a_commit_on_branch(&fs, &gitdir, &branches.main())?; + then::create_a_commit_on_branch(&fs, &gitdir, &branches.main())?; + let_assert!(Ok(result) = open_repository.commit_log(&branches.main(), &[])); + assert_eq!(result.len(), 1); + Ok(()) +} + +#[test] +// assumes running in the git-next repo which should have main, next and dev as remote branches +fn should_return_capacity_50_in_commit_log_when_searching_for_garbage() -> TestResult { + let_assert!(Ok(fs) = kxio::fs::temp()); + let branch_name = given::a_branch_name(); + let gitdir: config::GitDir = fs.base().to_path_buf().into(); + let test_repository = git::repository::test(fs.clone()); + let_assert!(Ok(open_repository) = test_repository.open(&gitdir)); + for _ in [0; 60] { + // create 60 commits + then::create_a_commit_on_branch(&fs, &gitdir, &branch_name)?; + } + let_assert!(Ok(result) = open_repository.commit_log(&branch_name, &[given::a_commit()])); + assert_eq!(result.len(), 50); + Ok(()) +} + +#[test] +// assumes running in the git-next repo which should have main, next and dev as remote branches +fn should_return_5_in_commit_log_when_searching_for_5th_item() -> TestResult { + let_assert!(Ok(fs) = kxio::fs::temp(), "create temp directory"); + let branch_name = given::a_branch_name(); + let gitdir: config::GitDir = fs.base().to_path_buf().into(); + let test_repository = git::repository::test(fs.clone()); + let_assert!( + Ok(open_repository) = test_repository.open(&gitdir), + "open repository" + ); + for _ in [0; 10] { + then::create_a_commit_on_branch(&fs, &gitdir, &branch_name)?; + } + // search to garbage to get all 10 items + let_assert!( + Ok(long_list) = open_repository.commit_log(&branch_name, &[given::a_commit()]), + "get commit_log" + ); + // pick the 5th item + let search = &long_list[4]; // zero-based + // search for the 25th item + let_assert!( + Ok(result) = open_repository.commit_log(&branch_name, &[search.clone()]), + "get commit log" + ); + // returns + assert_eq!(result.len(), 5); + + Ok(()) +} diff --git a/crates/git/src/repository/open/tests/fetch.rs b/crates/git/src/repository/open/tests/fetch.rs new file mode 100644 index 00000000..ff29cddf --- /dev/null +++ b/crates/git/src/repository/open/tests/fetch.rs @@ -0,0 +1,11 @@ +use super::*; + +#[test] +#[ignore] // requires authentication to the server - which the CI doesn't have +fn should_fetch_from_repo() { + // uses the current repo and fetches from the remote server + let_assert!(Ok(cwd) = std::env::current_dir()); + let gitdir = GitDir::from(cwd.join("../..")); + let_assert!(Ok(repo) = crate::repository::real().open(&gitdir)); + let_assert!(Ok(_) = repo.fetch()); +} diff --git a/crates/git/src/repository/open/tests/find_default_remote.rs b/crates/git/src/repository/open/tests/find_default_remote.rs new file mode 100644 index 00000000..dfd9b89f --- /dev/null +++ b/crates/git/src/repository/open/tests/find_default_remote.rs @@ -0,0 +1,17 @@ +use super::*; + +#[test] +fn should_find_default_push_remote() { + // uses the current repo + let_assert!(Ok(cwd) = std::env::current_dir()); + let gitdir = config::GitDir::from(cwd.join("../..")); // from ./crate/git directory to the project rook + let_assert!(Ok(repo) = crate::repository::real().open(&gitdir)); + let_assert!(Some(remote) = repo.find_default_remote(crate::repository::Direction::Push)); + assert_eq!( + remote, + git::GitRemote::new( + config::Hostname::new("git.kemitix.net"), + config::RepoPath::new("kemitix/git-next".to_string()) + ) + ) +} diff --git a/crates/git/src/repository/open/tests/forge_config.rs b/crates/git/src/repository/open/tests/forge_config.rs new file mode 100644 index 00000000..e05c2186 --- /dev/null +++ b/crates/git/src/repository/open/tests/forge_config.rs @@ -0,0 +1,102 @@ +use super::*; + +#[test] +fn should_return_repos() { + let forge_type = config::ForgeType::MockForge; + let hostname = given::a_name(); + let user = given::a_name(); + let token = given::a_name(); + // alphabetical order by key + let red_name = format!("a-{}", given::a_name()); + let blue_name = format!("b-{}", given::a_name()); + let red = + config::ServerRepoConfig::new(red_name.clone(), given::a_name(), None, None, None, None); + let blue = + config::ServerRepoConfig::new(blue_name.clone(), given::a_name(), None, None, None, None); + let mut repos = BTreeMap::new(); + repos.insert(red_name.clone(), red.clone()); + repos.insert(blue_name.clone(), blue.clone()); + let fc = config::ForgeConfig::new(forge_type, hostname, user, token, repos); + + let returned_repos = fc.repos().collect::>(); + + assert_eq!( + returned_repos, + vec![ + // alphabetical order by key + (config::RepoAlias::new(red_name.as_str()), &red), + (config::RepoAlias::new(blue_name.as_str()), &blue), + ] + ); +} + +#[test] +fn should_return_forge_type() { + let forge_type = config::ForgeType::MockForge; + let hostname = given::a_name(); + let user = given::a_name(); + let token = given::a_name(); + let repos = BTreeMap::new(); + let fc = config::ForgeConfig::new(forge_type, hostname, user, token, repos); + + assert_eq!(fc.forge_type(), config::ForgeType::MockForge); +} + +#[test] +fn should_return_hostname() { + let forge_type = config::ForgeType::MockForge; + let hostname = given::a_name(); + let user = given::a_name(); + let token = given::a_name(); + let repos = BTreeMap::new(); + let fc = config::ForgeConfig::new(forge_type, hostname.clone(), user, token, repos); + + assert_eq!(fc.hostname(), config::Hostname::new(hostname)); +} + +#[test] +fn should_return_user() { + let forge_type = config::ForgeType::MockForge; + let hostname = given::a_name(); + let user = given::a_name(); + let token = given::a_name(); + let repos = BTreeMap::new(); + let fc = config::ForgeConfig::new(forge_type, hostname, user.clone(), token, repos); + + assert_eq!(fc.user(), config::User::new(user)); +} + +#[test] +fn should_return_token() { + let forge_type = config::ForgeType::MockForge; + let hostname = given::a_name(); + let user = given::a_name(); + let token = given::a_name(); + let repos = BTreeMap::new(); + let fc = config::ForgeConfig::new(forge_type, hostname, user, token.clone(), repos); + + assert_eq!(fc.token().expose_secret(), token.as_str()); +} + +#[test] +fn should_return_repo() { + let forge_type = config::ForgeType::MockForge; + let hostname = given::a_name(); + let user = given::a_name(); + let token = given::a_name(); + let red_name = given::a_name(); + let blue_name = given::a_name(); + let red = + config::ServerRepoConfig::new(red_name.clone(), given::a_name(), None, None, None, None); + let blue = + config::ServerRepoConfig::new(blue_name.clone(), given::a_name(), None, None, None, None); + + let mut repos = BTreeMap::new(); + repos.insert(red_name.clone(), red.clone()); + repos.insert(blue_name, blue); + let fc = config::ForgeConfig::new(forge_type, hostname, user, token, repos); + + let returned_repo = fc.get_repo(red_name.as_str()); + + assert_eq!(returned_repo, Some(&red),); +} diff --git a/crates/git/src/repository/open/tests/mod.rs b/crates/git/src/repository/open/tests/mod.rs new file mode 100644 index 00000000..d047cc33 --- /dev/null +++ b/crates/git/src/repository/open/tests/mod.rs @@ -0,0 +1,21 @@ +// +use crate as git; +use assert2::let_assert; +use config::GitDir; +use git::repository::RepositoryLike as _; +use git::tests::given; +use git::tests::then; +use git_next_config as config; +use secrecy::ExposeSecret; +use std::collections::BTreeMap; +use std::path::PathBuf; + +type TestResult = Result<(), Box>; + +mod commit_log; +mod fetch; +mod find_default_remote; +mod forge_config; +mod read_file; +mod repo_config; +mod server_repo_config; diff --git a/crates/git/src/repository/open/tests/read_file.rs b/crates/git/src/repository/open/tests/read_file.rs new file mode 100644 index 00000000..7203e8da --- /dev/null +++ b/crates/git/src/repository/open/tests/read_file.rs @@ -0,0 +1,47 @@ +use super::*; + +#[test] +// assumes running in the git-next repo which should have main, next and dev as remote branches +fn should_return_file() -> TestResult { + let_assert!(Ok(fs) = kxio::fs::temp()); + let repo_config = given::a_repo_config(); + let file_name = given::a_pathbuf(); + let contents = given::a_name(); + let gitdir: config::GitDir = fs.base().to_path_buf().into(); + + let test_repository = git::repository::test(fs.clone()); + let_assert!(Ok(open_repository) = test_repository.open(&gitdir)); + then::commit_named_file_to_branch( + &file_name, + &contents, + &fs, + &gitdir, + &repo_config.branches().main(), + )?; + // then::create_a_commit_on_branch(&fs, &gitdir, &repo_config.branches().main())?; + let_assert!( + Ok(result) = open_repository.read_file(&repo_config.branches().main(), &file_name), + "read file" + ); + assert_eq!(result, contents); + Ok(()) +} + +#[test] +// assumes running in the git-next repo which should have main, next and dev as remote branches +fn should_error_on_missing_file() -> TestResult { + let_assert!(Ok(fs) = kxio::fs::temp()); + let gitdir: config::GitDir = fs.base().to_path_buf().into(); + let test_repository = git::repository::test(fs.clone()); + let_assert!(Ok(open_repository) = test_repository.open(&gitdir)); + let repo_config = &given::a_repo_config(); + let branches = repo_config.branches(); + then::create_a_commit_on_branch(&fs, &gitdir, &branches.dev())?; + let_assert!( + Err(err) = open_repository.read_file(&branches.dev(), &given::a_pathbuf()), + "read file" + ); + eprintln!("err: {err:#?}"); + assert!(matches!(err, git::file::Error::FileNotFound)); + Ok(()) +} diff --git a/crates/git/src/repository/open/tests/repo_config.rs b/crates/git/src/repository/open/tests/repo_config.rs new file mode 100644 index 00000000..90173333 --- /dev/null +++ b/crates/git/src/repository/open/tests/repo_config.rs @@ -0,0 +1,50 @@ +use super::*; + +#[test] +fn should_parse_toml() -> TestResult { + let main = given::a_name(); + let next = given::a_name(); + let dev = given::a_name(); + let toml = format!( + r#" + [branches] + main = "{main}" + next = "{next}" + dev = "{dev}" + "# + ); + + let rc = config::RepoConfig::parse(toml.as_str())?; + + assert_eq!( + rc, + config::RepoConfig::new( + config::RepoBranches::new(main, next, dev), + config::RepoConfigSource::Repo // reading from repo is the default + ) + ); + + Ok(()) +} +#[test] +fn should_return_branches() { + let main = given::a_name(); + let next = given::a_name(); + let dev = given::a_name(); + let branches = config::RepoBranches::new(main, next, dev); + let repo_config = config::RepoConfig::new(branches.clone(), config::RepoConfigSource::Repo); + + assert_eq!(repo_config.branches(), &branches); +} +#[test] +fn should_return_source() { + let main = given::a_name(); + let next = given::a_name(); + let dev = given::a_name(); + let repo_config = config::RepoConfig::new( + config::RepoBranches::new(main, next, dev), + config::RepoConfigSource::Repo, + ); + + assert_eq!(repo_config.source(), config::RepoConfigSource::Repo); +} diff --git a/crates/git/src/repository/open/tests/server_repo_config.rs b/crates/git/src/repository/open/tests/server_repo_config.rs new file mode 100644 index 00000000..6144cf59 --- /dev/null +++ b/crates/git/src/repository/open/tests/server_repo_config.rs @@ -0,0 +1,84 @@ +use super::*; + +#[test] +fn should_not_return_repo_config_when_no_branches() { + let main = None; + let next = None; + let dev = None; + let src = + config::ServerRepoConfig::new(given::a_name(), given::a_name(), None, main, next, dev); + + let_assert!(None = src.repo_config()); +} + +#[test] +fn should_return_repo_config_when_branches() { + let main = given::a_name(); + let next = given::a_name(); + let dev = given::a_name(); + let src = config::ServerRepoConfig::new( + given::a_name(), + given::a_name(), + None, + Some(main.clone()), + Some(next.clone()), + Some(dev.clone()), + ); + + let_assert!(Some(rc) = src.repo_config()); + assert_eq!( + rc, + config::RepoConfig::new( + config::RepoBranches::new(main, next, dev), + config::RepoConfigSource::Server + ) + ); +} + +#[test] +fn should_return_repo() { + let repo_path = given::a_name(); + let src = config::ServerRepoConfig::new( + repo_path.clone(), + given::a_name(), + None, + Some(given::a_name()), + Some(given::a_name()), + Some(given::a_name()), + ); + + assert_eq!(src.repo(), config::RepoPath::new(repo_path)); +} + +#[test] +fn should_return_branch() { + let branch = given::a_name(); + let src = config::ServerRepoConfig::new( + given::a_name(), + branch.clone(), + None, + Some(given::a_name()), + Some(given::a_name()), + Some(given::a_name()), + ); + + assert_eq!(src.branch(), config::BranchName::new(branch)); +} + +#[test] +fn should_return_gitdir() { + let gitdir = given::a_name(); + let src = config::ServerRepoConfig::new( + given::a_name(), + given::a_name(), + Some(gitdir.clone().into()), + Some(given::a_name()), + Some(given::a_name()), + Some(given::a_name()), + ); + + assert_eq!( + src.gitdir(), + Some(config::GitDir::new(PathBuf::default().join(gitdir))) + ); +}