using System; using System.IO.Pipelines; using System.Threading; using System.Threading.Tasks; using LibGit2Sharp; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using Remora.Rest.Core; using Tgstation.Server.Host.Components.Events; using Tgstation.Server.Host.Configuration; using Tgstation.Server.Host.IO; using Tgstation.Server.Host.Jobs; namespace Tgstation.Server.Host.Components.Repository.Tests { [TestClass] public sealed class TestRepositoryManager { const string TestRepoPath = "adfiwurjwhouerfiunfjdfn"; RepositoryManager repositoryManager; Mock mockRepoFactory; Mock mockCommands; Mock mockIOManager; Mock mockGitRemoteFeaturesFactory; [TestInitialize] public void Initialize() { mockIOManager = new Mock(); mockRepoFactory = new Mock(); mockCommands = new Mock(); mockGitRemoteFeaturesFactory = new Mock(); mockIOManager.Setup(x => x.ResolvePath()).Returns(TestRepoPath); repositoryManager = new RepositoryManager( mockRepoFactory.Object, mockCommands.Object, mockIOManager.Object, Mock.Of(), Mock.Of(), mockGitRemoteFeaturesFactory.Object, Mock.Of>(), Mock.Of>(), Mock.Of>()); } [TestCleanup] public void TestCleanup() => repositoryManager.Dispose(); [TestMethod] public async Task TestCloneAbortsIfRepoExists() { mockIOManager.Setup(x => x.DirectoryExists(TestRepoPath, It.IsAny())).ReturnsAsync(true).Verifiable(); using var cloneResult = await repositoryManager.CloneRepository( new Uri("https://github.com/Cyberboss/common_core"), null, null, null, null, false, CancellationToken.None); Assert.IsNull(cloneResult); mockIOManager.VerifyAll(); } [TestMethod] public async Task TestBasicClone() { mockIOManager.Setup(x => x.DirectoryExists(TestRepoPath, It.IsAny())).ReturnsAsync(false).Verifiable(); var mockRepo = new Mock(); mockRepoFactory.Setup(x => x.CreateFromPath(TestRepoPath, It.IsAny())).ReturnsAsync(mockRepo.Object).Verifiable(); using var cloneResult = await repositoryManager.CloneRepository( new Uri("https://github.com/Cyberboss/common_core"), null, null, null, new JobProgressReporter(), false, CancellationToken.None); Assert.IsNotNull(cloneResult); mockRepoFactory.VerifyAll(); mockIOManager.VerifyAll(); } [TestMethod] public async Task TestBasicLoad() { mockIOManager.Setup(x => x.DirectoryExists(TestRepoPath, It.IsAny())).ReturnsAsync(false).Verifiable(Times.Never); var mockRepo = new Mock(); mockRepoFactory.Setup(x => x.CreateFromPath(TestRepoPath, It.IsAny())).ReturnsAsync(mockRepo.Object).Verifiable(); using var loadResult = await repositoryManager.LoadRepository( CancellationToken.None); Assert.IsNotNull(loadResult); mockRepoFactory.VerifyAll(); mockIOManager.VerifyAll(); } [TestMethod] public async Task TestLoadFailsIfRepoDoesntExist() { mockIOManager.Setup(x => x.DirectoryExists(TestRepoPath, It.IsAny())).ReturnsAsync(false).Verifiable(Times.Never); var mockRepo = new Mock(); mockRepoFactory.Setup(x => x.CreateFromPath(TestRepoPath, It.IsAny())).ThrowsAsync(new RepositoryNotFoundException()).Verifiable(); using var loadResult = await repositoryManager.LoadRepository( CancellationToken.None); Assert.IsNull(loadResult); mockRepoFactory.VerifyAll(); mockIOManager.VerifyAll(); } } }