using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Moq; using Octokit; using Tgstation.Server.Host.Configuration; using Tgstation.Server.Host.Extensions; using Tgstation.Server.Host.Security; using Tgstation.Server.Host.System; using Tgstation.Server.Host.Tests; using Tgstation.Server.Host.Utils.GitHub; namespace Tgstation.Server.Tests.Live { sealed class TestingGitHubService : IAuthenticatedGitHubService { static Dictionary releasesDictionary; static PullRequest testPr; static GitHubCommit testCommit; readonly ICryptographySuite cryptographySuite; readonly ILogger logger; public static readonly IGitHubClient RealClient; static TestingGitHubService() { var mockOptions = new Mock>(); mockOptions.SetupGet(x => x.CurrentValue).Returns(new GeneralConfiguration { GitHubAccessToken = Environment.GetEnvironmentVariable("TGS_TEST_GITHUB_TOKEN") }); var gitHubClientFactory = new GitHubClientFactory(new AssemblyInformationProvider(), new BasicHttpMessageHandlerFactory(), mockOptions.Object, Mock.Of>()); RealClient = gitHubClientFactory.CreateClient(CancellationToken.None).GetAwaiter().GetResult(); } public static async Task InitializeAndInject(CancellationToken cancellationToken) { Release targetRelease; do { var releases = await RealClient .Repository .Release .GetAll("tgstation", "tgstation-server") .WaitAsync(cancellationToken); targetRelease = releases.FirstOrDefault(release => release.TagName == $"{new UpdatesConfiguration().GitTagPrefix}{TestLiveServer.TestUpdateVersion}"); } while (targetRelease == null); releasesDictionary = new Dictionary { { TestLiveServer.TestUpdateVersion, targetRelease } }; var testCommitTask = RealClient .Repository .Commit .Get("Cyberboss", "common_core", "4b4926dfaf6295f19f8ae7abf03cb357dbb05b29") .WaitAsync(cancellationToken); testPr = await RealClient .PullRequest .Get("Cyberboss", "common_core", 2) .WaitAsync(cancellationToken); testCommit = await testCommitTask; ServiceCollectionExtensions.UseGitHubServiceFactory(); } public TestingGitHubService(ICryptographySuite cryptographySuite, ILogger logger) { this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite)); this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); logger.LogTrace("Created"); } public Task CommentOnIssue(string repoOwner, string repoName, string comment, int issueNumber, CancellationToken cancellationToken) { logger.LogTrace("CommentOnIssue"); return Task.CompletedTask; } public Task AppendCommentOnIssue(string repoOwner, string repoName, string comment, IssueComment issueComment, CancellationToken cancellationToken) { logger.LogTrace("AppendCommentOnIssue"); return Task.CompletedTask; } public ValueTask GetExistingCommentOnIssue(string repoOwner, string repoName, string header, int issueNumber, CancellationToken cancellationToken) { logger.LogTrace("GetExistingCommentOnIssue"); return ValueTask.FromResult(null); } public ValueTask CreateDeployment(NewDeployment newDeployment, string repoOwner, string repoName, CancellationToken cancellationToken) { logger.LogTrace("CreateDeployment"); return ValueTask.FromResult(new Random().Next()); ; } public Task CreateDeploymentStatus(NewDeploymentStatus newDeploymentStatus, string repoOwner, string repoName, long deploymentId, CancellationToken cancellationToken) { logger.LogTrace("CreateDeploymentStatus"); return Task.CompletedTask; } public Task CreateDeploymentStatus(NewDeploymentStatus newDeploymentStatus, long repoId, long deploymentId, CancellationToken cancellationToken) { logger.LogTrace("CreateDeploymentStatus"); return Task.CompletedTask; } public ValueTask CreateOAuthAccessToken(OAuthConfiguration oAuthConfiguration, string code, CancellationToken cancellationToken) { logger.LogTrace("CreateOAuthAccessToken"); return ValueTask.FromResult(cryptographySuite.GetSecureString()); } public ValueTask GetCurrentUserId(CancellationToken cancellationToken) { logger.LogTrace("GetCurrentUserId"); return ValueTask.FromResult(new Random().Next()); } public ValueTask GetRepositoryId(string repoOwner, string repoName, CancellationToken cancellationToken) { logger.LogTrace("GetRepositoryId"); return ValueTask.FromResult(new Random().NextInt64()); } public ValueTask GetUpdatesRepositoryUrl(CancellationToken cancellationToken) { logger.LogTrace("GetUpdatesRepositoryUrl"); return ValueTask.FromResult(new Uri("https://github.com/tgstation/tgstation-server")); } public Task GetPullRequest(string repoOwner, string repoName, int pullRequestNumber, CancellationToken cancellationToken) { logger.LogTrace("GetPullRequest"); return Task.FromResult(testPr); } public Task GetCommit(string repoOwner, string repoName, string committish, CancellationToken cancellationToken) { logger.LogTrace("GetPullRequest"); return Task.FromResult(testCommit); } public ValueTask> GetTgsReleases(CancellationToken cancellationToken) { logger.LogTrace("GetTgsReleases"); return ValueTask.FromResult(releasesDictionary); } } }