using System.Text; using ModuleCore.Git; using ModuleTests.Git.TestData; namespace ModuleTests.Git; // TODO: [#12] GitRepoRegistration tests should reset database at start of each test public class AddRegistrationTests { private static readonly VerifySettings Settings; static AddRegistrationTests() { Settings = new VerifySettings(); var testBaseDirectory = Path.Join(TestConstants.SnapshotFolderName, nameof(AddRegistrationTests)); Settings.UseDirectory(testBaseDirectory); Settings.DisableDiff(); } [Theory] [ClassData(typeof(AddRegistrationTestData))] public Task BasicRepoRegistration((int testId, string path) testData) { Settings.UseFileName($"{nameof(BasicRepoRegistration)}_{testData.testId}"); var gitManager = GitRepoRegistrationManager.InternalFreshInstance(nameof(BasicRepoRegistration)); try { var repoRegistration = gitManager.RegisterRepo("Test:/some/test/repo", testData.path); var sb = new StringBuilder(); sb.AppendLine($"Attempted to register: {testData.path}") .AppendLine($"Registration result: {repoRegistration}"); return Verify(sb, Settings); } finally { gitManager.DeleteDatabase(); } } [Fact] public void RepoRegistrationWithEmptyName() { Settings.UseFileName(nameof(RepoRegistrationWithEmptyName)); var gitManager = GitRepoRegistrationManager.InternalFreshInstance(nameof(RepoRegistrationWithEmptyName)); var testRepoAbsolutePath = "Test:/some/test/repo"; try { var emptyName = gitManager.RegisterRepo(testRepoAbsolutePath, ""); Assert.Equal("repo", emptyName); } finally { gitManager.DeleteDatabase(); } } [Fact] public void RepoRegistrationWithNullName() { Settings.UseFileName(nameof(RepoRegistrationWithNullName)); var gitManager = GitRepoRegistrationManager.InternalFreshInstance(nameof(RepoRegistrationWithNullName)); var testRepoAbsolutePath = "Test:/some/test/repo"; try { // Name is technically not-nullable, but string is a reference type so null can be passed in so we should test // it regardless var nullName = gitManager.RegisterRepo(testRepoAbsolutePath, null!); Assert.Equal("repo", nullName); } finally { gitManager.DeleteDatabase(); } } [Fact] public void RepoRegistrationWithWhitespaceName() { Settings.UseFileName(nameof(RepoRegistrationWithWhitespaceName)); var gitManager = GitRepoRegistrationManager.InternalFreshInstance(nameof(RepoRegistrationWithWhitespaceName)); var testRepoAbsolutePath = "Test:/some/test/repo"; try { var whitespaceName = gitManager.RegisterRepo(testRepoAbsolutePath, " "); Assert.Equal("repo", whitespaceName); } finally { gitManager.DeleteDatabase(); } } [Fact] public void DuplicateRepoRegistrationShouldFail() { Settings.UseFileName(nameof(RepoRegistrationWithWhitespaceName)); var gitManager = GitRepoRegistrationManager.InternalFreshInstance(nameof(RepoRegistrationWithWhitespaceName)); var testRepoAbsolutePath = "Test:/some/test/repo"; string[] paths = ["test", "nested", "path"]; var names = (NormalSeparator: string.Join(Path.DirectorySeparatorChar, paths), AltSeparator: string.Join(Path.AltDirectorySeparatorChar, paths)); try { var firstRegistration = gitManager.RegisterRepo(testRepoAbsolutePath, names.NormalSeparator); var secondRegistration = gitManager.RegisterRepo(testRepoAbsolutePath, Path.Combine(paths[..1])); Assert.Equal(Path.Combine(paths), firstRegistration); Assert.Equal(Path.Combine(paths[..1]), secondRegistration); Assert.Throws(() => gitManager.RegisterRepo(testRepoAbsolutePath, Path.Combine(paths[..1]))); } finally { gitManager.DeleteDatabase(); } } [Fact] public void DuplicateRepoRegistrationDifferentSlashShouldNotFail() { Settings.UseFileName(nameof(RepoRegistrationWithWhitespaceName)); var gitManager = GitRepoRegistrationManager.InternalFreshInstance(nameof(RepoRegistrationWithWhitespaceName)); var testRepoAbsolutePath = "Test:/some/test/repo"; string[] paths = ["test", "nested", "path"]; var names = (NormalSeparator: string.Join(Path.DirectorySeparatorChar, paths), AltSeparator: string.Join(Path.AltDirectorySeparatorChar, paths)); try { var firstRegistration = gitManager.RegisterRepo(testRepoAbsolutePath, names.NormalSeparator); var secondRegistration = gitManager.RegisterRepo(testRepoAbsolutePath, Path.Combine(paths[..1])); var differentPathSeparatorRegistration = gitManager.RegisterRepo(testRepoAbsolutePath, names.AltSeparator); Assert.Equal(Path.Combine(paths), firstRegistration); Assert.Equal(Path.Combine(paths[..1]), secondRegistration); Assert.Equal(names.AltSeparator, differentPathSeparatorRegistration); } finally { gitManager.DeleteDatabase(); } } }