From 1ad7d8bbe519e7c4ef5ace437005f94c0ca31ffd Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Thu, 4 Oct 2018 17:43:44 -0400 Subject: [PATCH] WIP tests for setup wizard --- .../Core/TestSetupWizard.cs | 183 ++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 tests/Tgstation.Server.Host.Tests/Core/TestSetupWizard.cs diff --git a/tests/Tgstation.Server.Host.Tests/Core/TestSetupWizard.cs b/tests/Tgstation.Server.Host.Tests/Core/TestSetupWizard.cs new file mode 100644 index 0000000000..2db14803d4 --- /dev/null +++ b/tests/Tgstation.Server.Host.Tests/Core/TestSetupWizard.cs @@ -0,0 +1,183 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Tgstation.Server.Host.Configuration; +using Tgstation.Server.Host.IO; + +namespace Tgstation.Server.Host.Core.Tests +{ + [TestClass] + public sealed class TestSetupWizard + { + [TestMethod] + public void TestConstructionThrows() + { + Assert.ThrowsException(() => new SetupWizard(null, null, null, null, null, null, null)); + var mockIOManager = new Mock(); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, null, null, null, null, null, null)); + var mockConsole = new Mock(); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, null, null, null, null, null)); + var mockHostingEnvironment = new Mock(); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, null, null, null, null)); + var mockApplication = new Mock(); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockApplication.Object, null, null, null)); + var mockDBConnectionFactory = new Mock(); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockApplication.Object, mockDBConnectionFactory.Object, null, null)); + var mockLogger = new Mock>(); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockApplication.Object, mockDBConnectionFactory.Object, mockLogger.Object, null)); + } + + //TODO + [TestMethod] + public async Task WIPTestWithUserStupiditiy() + { + Assert.Inconclusive(); + + var mockIOManager = new Mock(); + var mockConsole = new Mock(); + var mockHostingEnvironment = new Mock(); + var mockApplication = new Mock(); + var mockDBConnectionFactory = new Mock(); + var mockLogger = new Mock>(); + var mockGeneralConfigurationOptions = new Mock>(); + + var testGeneralConfig = new GeneralConfiguration + { + SetupWizardMode = SetupWizardMode.Never + }; + mockGeneralConfigurationOptions.SetupGet(x => x.Value).Returns(testGeneralConfig).Verifiable(); + + var wizard = new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockApplication.Object, mockDBConnectionFactory.Object, mockLogger.Object, mockGeneralConfigurationOptions.Object); + + Assert.IsFalse(await wizard.CheckRunWizard(default).ConfigureAwait(false)); + + testGeneralConfig.SetupWizardMode = SetupWizardMode.Force; + await Assert.ThrowsExceptionAsync(() => wizard.CheckRunWizard(default)).ConfigureAwait(false); + + testGeneralConfig.SetupWizardMode = SetupWizardMode.Only; + mockConsole.SetupGet(x => x.Available).Returns(true).Verifiable(); + Assert.IsFalse(await wizard.CheckRunWizard(default).ConfigureAwait(false)); + + mockIOManager.Setup(x => x.FileExists(It.IsNotNull(), It.IsAny())).Returns(Task.FromResult(true)).Verifiable(); + mockIOManager.Setup(x => x.ReadAllBytes(It.IsNotNull(), It.IsAny())).Returns(Task.FromResult(Encoding.UTF8.GetBytes("cucked"))).Verifiable(); + mockIOManager.Setup(x => x.WriteAllBytes(It.IsNotNull(), It.IsNotNull(), It.IsAny())).Returns(Task.CompletedTask).Verifiable(); + + var mockGoodDbConnection = new Mock(); + mockGoodDbConnection.Setup(x => x.OpenAsync(It.IsAny())).Returns(Task.CompletedTask).Verifiable(); + + var mockBadDbConnection = new Mock(); + mockGoodDbConnection.Setup(x => x.OpenAsync(It.IsAny())).Throws(new Exception()).Verifiable(); + + void AddVersionReturn(Mock mock) => mock.Setup(x => x.ExecuteScalarAsync(It.IsAny())).Returns(Task.FromResult("1.2.3")).Verifiable(); + var mockSuccessCommand = new Mock(); + mockSuccessCommand.Setup(x => x.ExecuteNonQueryAsync(It.IsAny())).Returns(Task.FromResult(0)).Verifiable(); + AddVersionReturn(mockSuccessCommand); + var mockFailCommand = new Mock(); + mockFailCommand.Setup(x => x.ExecuteNonQueryAsync(It.IsAny())).Throws(new Exception()).Verifiable(); + AddVersionReturn(mockFailCommand); + var secondTime = false; + var mockUglyDbConnection = new Mock(); + mockUglyDbConnection.Setup(x => x.CreateCommand()).Returns(() => + { + if (!secondTime) + { + secondTime = true; + return mockSuccessCommand.Object; + } + else + return mockFailCommand.Object; + }).Verifiable(); + + mockDBConnectionFactory.Setup(x => x.CreateConnection(It.IsAny(), DatabaseType.SqlServer)).Returns(mockBadDbConnection.Object).Verifiable(); + mockDBConnectionFactory.Setup(x => x.CreateConnection(It.IsAny(), DatabaseType.MariaDB)).Returns(mockGoodDbConnection.Object).Verifiable(); + mockDBConnectionFactory.Setup(x => x.CreateConnection(It.IsAny(), DatabaseType.MySql)).Returns(mockUglyDbConnection.Object).Verifiable(); + + var finalInputSequence = new List() + { + //first run, just say no to the force prompt after testing it + "fake", + "n", + //second run say yes to the force prompt + "y", + //first normal run + "bad port number", + "0", + "666", + "FakeDBType", + nameof(DatabaseType.SqlServer), + "this isn't validated", + "nor is this", + "no", + }; + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + finalInputSequence.Add("yes"); + else + finalInputSequence.AddRange(new List + { + "username", + "password" + }); + finalInputSequence.AddRange(new List + { + //sql server will always fail so reconfigure with maria + nameof(DatabaseType.MariaDB), + "bleh", + "blah", + "user", + "pass", + //general config + "four", + "-12", + "16", + "eight", + "-27", + "5000", + "fake token", + //saved, now for second run + //this time use defaults amap + + //TODO + }); + + var inputPos = 0; + + mockConsole.Setup(x => x.PressAnyKeyAsync(It.IsAny())).Returns(Task.CompletedTask).Verifiable(); + mockConsole.Setup(x => x.ReadLineAsync(It.IsAny(), It.IsAny())).Returns(() => + { + if (inputPos == finalInputSequence.Count) + Assert.Fail("Exhausted input sequence!"); + return Task.FromResult(finalInputSequence[inputPos++]); + }).Verifiable(); + mockConsole.Setup(x => x.WriteAsync(It.IsAny(), It.IsAny(), It.IsAny())).Returns(Task.CompletedTask).Verifiable(); + + //first real run + Assert.IsTrue(await wizard.CheckRunWizard(default).ConfigureAwait(false)); + + //second run + mockIOManager.Setup(x => x.ReadAllBytes(It.IsNotNull(), It.IsAny())).Returns(Task.FromResult(Encoding.UTF8.GetBytes(String.Empty))).Verifiable(); + Assert.IsTrue(await wizard.CheckRunWizard(default).ConfigureAwait(false)); + + //third run + testGeneralConfig.SetupWizardMode = SetupWizardMode.Autodetect; + mockIOManager.Setup(x => x.WriteAllBytes(It.IsNotNull(), It.IsNotNull(), It.IsAny())).Throws(new Exception()).Verifiable(); + await Assert.ThrowsExceptionAsync(() => wizard.CheckRunWizard(default)).ConfigureAwait(false); + + mockFailCommand.VerifyAll(); + mockSuccessCommand.VerifyAll(); + mockIOManager.VerifyAll(); + mockGeneralConfigurationOptions.VerifyAll(); + mockConsole.VerifyAll(); + mockGoodDbConnection.VerifyAll(); + mockDBConnectionFactory.VerifyAll(); + } + } +}