using System.Text; using ModuleCore.Calendar; using ModuleCore.Git; using ModuleTests.Git.TestData; namespace ModuleTests.Git; 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 = GitManager.InternalFreshInstance(nameof(BasicRepoRegistration)); 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}"); gitManager.DeleteDatabase(); return Verify(sb, Settings); } [Fact] public void RepoRegistrationWithEmptyName() { Settings.UseFileName(nameof(RepoRegistrationWithEmptyName)); var gitManager = GitManager.InternalFreshInstance(nameof(RepoRegistrationWithEmptyName)); var testRepoAbsolutePath = "Test:/some/test/repo"; var emptyName = gitManager.RegisterRepo(testRepoAbsolutePath, ""); gitManager.DeleteDatabase(); Assert.Equal("repo", emptyName); } [Fact] public void RepoRegistrationWithNullName() { Settings.UseFileName(nameof(RepoRegistrationWithNullName)); var gitManager = GitManager.InternalFreshInstance(nameof(RepoRegistrationWithNullName)); var testRepoAbsolutePath = "Test:/some/test/repo"; // 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!); gitManager.DeleteDatabase(); Assert.Equal("repo", nullName); } [Fact] public void RepoRegistrationWithWhitespaceName() { Settings.UseFileName(nameof(RepoRegistrationWithWhitespaceName)); var gitManager = GitManager.InternalFreshInstance(nameof(RepoRegistrationWithWhitespaceName)); var testRepoAbsolutePath = "Test:/some/test/repo"; var whitespaceName = gitManager.RegisterRepo(testRepoAbsolutePath, " "); gitManager.DeleteDatabase(); Assert.Equal("repo", whitespaceName); } [Fact] public void DuplicateRepoRegistrationShouldFail() { Settings.UseFileName(nameof(RepoRegistrationWithWhitespaceName)); var gitManager = GitManager.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)); var firstRegistration = gitManager.RegisterRepo(testRepoAbsolutePath, names.NormalSeparator); // TODO: make nested registrations fail in both directions and test 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]))); gitManager.DeleteDatabase(); } [Fact] public void DuplicateRepoRegistrationDifferentSlashShouldNotFail() { Settings.UseFileName(nameof(RepoRegistrationWithWhitespaceName)); var gitManager = GitManager.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)); var firstRegistration = gitManager.RegisterRepo(testRepoAbsolutePath, names.NormalSeparator); // TODO: make nested registrations fail in both directions and test var secondRegistration = gitManager.RegisterRepo(testRepoAbsolutePath, Path.Combine(paths[..1])); var differentPathSeparatorRegistration = gitManager.RegisterRepo(testRepoAbsolutePath, names.AltSeparator); gitManager.DeleteDatabase(); Assert.Equal(Path.Combine(paths), firstRegistration); Assert.Equal(Path.Combine(paths[..1]), secondRegistration); Assert.Equal(names.AltSeparator, differentPathSeparatorRegistration); } }