using Microsoft.Extensions.DependencyInjection; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using System; using System.Threading.Tasks; using Tgstation.Server.Host.Models; namespace Tgstation.Server.Host.Database.Tests { [TestClass] public sealed class TestDatabaseContextFactory { [TestMethod] public void TestConstructionThrows() { Assert.ThrowsExactly(() => new DatabaseContextFactory(null)); var mockProvider = new Mock(); mockProvider.Setup(x => x.GetService(typeof(IDatabaseContext))).Verifiable(); var mockScope = new Mock(); mockScope.SetupGet(x => x.ServiceProvider).Returns(mockProvider.Object).Verifiable(); var mockScopeFactory = new Mock(); mockScopeFactory.Setup(x => x.CreateScope()).Returns(mockScope.Object).Verifiable(); Assert.ThrowsExactly(() => new DatabaseContextFactory(mockScopeFactory.Object)); mockScopeFactory.VerifyAll(); mockScope.VerifyAll(); mockProvider.VerifyAll(); } [TestMethod] public async Task TestWorks() { var mockDatabase = new Mock(); var mockProvider = new Mock(); var mockDbo = mockDatabase.Object; mockProvider.Setup(x => x.GetService(typeof(IDatabaseContext))).Returns(mockDbo).Verifiable(); var mockScope = new Mock(); mockScope.SetupGet(x => x.ServiceProvider).Returns(mockProvider.Object).Verifiable(); var mockScopeFactory = new Mock(); mockScopeFactory.Setup(x => x.CreateScope()).Returns(mockScope.Object).Verifiable(); var factory = new DatabaseContextFactory(mockScopeFactory.Object); await Assert.ThrowsExactlyAsync(() => factory.UseContext(null).AsTask()); await factory.UseContext(context => { Assert.AreSame(mockDbo, context); return ValueTask.CompletedTask; }); mockScopeFactory.VerifyAll(); mockScope.VerifyAll(); mockProvider.VerifyAll(); } } }