using System.Reflection; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders; using RpgRoller.Hosting; namespace RpgRoller.Tests; public sealed class BackendCoverageTests { [Fact] public void AddRpgRollerCore_WithInMemoryConnectionString_RegistersCoreServices() { var services = new ServiceCollection(); var configuration = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary { ["ConnectionStrings:RpgRoller"] = "Data Source=:memory:" }) .Build(); var environment = new TestWebHostEnvironment { ContentRootPath = Path.GetTempPath() }; services.AddRpgRollerCore(configuration, environment); Assert.Contains(services, d => d.ServiceType == typeof(RpgRoller.Services.IGameService)); Assert.Contains(services, d => d.ServiceType == typeof(RpgRoller.Services.IDiceRoller)); } [Fact] public void GetRequiredSessionToken_ThrowsWhenTokenWasNotStored() { var extensionsType = typeof(Program).Assembly.GetType("RpgRoller.Api.SessionTokenHttpContextExtensions"); Assert.NotNull(extensionsType); var method = extensionsType!.GetMethod( "GetRequiredSessionToken", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); Assert.NotNull(method); var context = new DefaultHttpContext(); var exception = Assert.Throws(() => method!.Invoke(null, [context])); Assert.IsType(exception.InnerException); } private sealed class TestWebHostEnvironment : IWebHostEnvironment { public string ApplicationName { get; set; } = "RpgRoller.Tests"; public IFileProvider WebRootFileProvider { get; set; } = new NullFileProvider(); public string WebRootPath { get; set; } = string.Empty; public string EnvironmentName { get; set; } = "Development"; public string ContentRootPath { get; set; } = string.Empty; public IFileProvider ContentRootFileProvider { get; set; } = new NullFileProvider(); } }