Anapher/Strive

View on GitHub
src/Services/ConferenceManagement/Strive.IntegrationTests/CustomWebApplicationFactory.cs

Summary

Maintainability
A
0 mins
Test Coverage
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Security.Claims;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using Serilog;
using Serilog.Events;
using Strive.IntegrationTests._Helpers;
using Xunit.Abstractions;

namespace Strive.IntegrationTests
{
    public class CustomWebApplicationFactory : WebApplicationFactory<Startup>
    {
        private readonly ITestOutputHelper _testOutputHelper;
        private readonly MongoDbFixture _mongoDb;

        public CustomWebApplicationFactory(MongoDbFixture mongoDb, ITestOutputHelper testOutputHelper)
        {
            _testOutputHelper = testOutputHelper;
            _mongoDb = mongoDb;
        }

        public MockJwtTokens JwtTokens { get; } = new();

        public UserAccount CreateUser(string name, bool isModerator)
        {
            var sub = Guid.NewGuid().ToString("N");

            var claims = new List<Claim> {new(ClaimTypes.NameIdentifier, sub), new("name", name)};
            if (isModerator)
                claims.Add(new Claim(ClaimTypes.Role, AppRoles.Administrator));

            var token = JwtTokens.GenerateJwtToken(claims);
            return new UserAccount(sub, name, isModerator, token);
        }

        protected override IWebHostBuilder CreateWebHostBuilder()
        {
            return base.CreateWebHostBuilder().UseSerilog(GetLoggerConfig().CreateLogger());
        }

        private LoggerConfiguration GetLoggerConfig()
        {
            return new LoggerConfiguration().WriteTo.TestOutput(_testOutputHelper, LogEventLevel.Debug).MinimumLevel
                .Debug();
        }

        protected override void ConfigureWebHost(IWebHostBuilder builder)
        {
            var configuration = StartMongoDbAndGetConfiguration();

            builder.ConfigureAppConfiguration(configurationBuilder =>
                configurationBuilder.AddConfiguration(configuration));

            builder.ConfigureServices(services =>
            {
                services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
                {
                    var config = new OpenIdConnectConfiguration {Issuer = JwtTokens.Issuer};

                    config.SigningKeys.Add(JwtTokens.SecurityKey);
                    options.Configuration = config;
                });
            });
        }

        private IConfiguration StartMongoDbAndGetConfiguration()
        {
            var configuration = new ConfigurationBuilder()
                .AddJsonFile(new EmbeddedFileProvider(typeof(CustomWebApplicationFactory).Assembly),
                    "appsettings.IntegrationTest.json", false, false).Build();

            configuration["MongoDb:ConnectionString"] = _mongoDb.Runner.ConnectionString;
            return configuration;
        }
    }

    public record UserAccount(string Sub, string Name, bool IsModerator, string Token)
    {
        public UserAccount SetupHttpClient(HttpClient client)
        {
            client.DefaultRequestHeaders.Authorization =
                new AuthenticationHeaderValue(JwtBearerDefaults.AuthenticationScheme, Token);
            return this;
        }
    }
}