File: EnrichMongoDbTests.cs
Web Access
Project: src\tests\Aspire.MongoDB.EntityFrameworkCore.Tests\Aspire.MongoDB.EntityFrameworkCore.Tests.csproj (Aspire.MongoDB.EntityFrameworkCore.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Aspire.MongoDB.Driver.Tests;
using Aspire.TestUtilities;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using OpenTelemetry.Trace;
using Xunit;
 
namespace Aspire.MongoDB.EntityFrameworkCore.Tests;
 
public class EnrichMongoDbTests : ConformanceTests
{
    public EnrichMongoDbTests(MongoDbContainerFixture? containerFixture)
        : base(containerFixture)
    {
    }
 
    protected override void RegisterComponent(HostApplicationBuilder builder, Action<MongoDBEntityFrameworkCoreSettings>? configure = null, string? key = null)
    {
        builder.Services.AddDbContextPool<TestDbContext>(options => options.UseMongoDB(ConnectionString, DatabaseName));
        builder.EnrichMongoDbContext<TestDbContext>(configure);
    }
 
    [Fact]
    public void ShouldThrowIfDbContextIsNotRegistered()
    {
        HostApplicationBuilder builder = Host.CreateEmptyApplicationBuilder(settings: null);
 
        var exception = Assert.Throws<InvalidOperationException>(() => builder.EnrichMongoDbContext<TestDbContext>());
        Assert.Equal("DbContext<TestDbContext> was not registered. Ensure you have registered the DbContext in DI before calling EnrichMongoDbContext.", exception.Message);
    }
 
    [Fact]
    public void ShouldNotThrowIfDbContextIsRegistered()
    {
        HostApplicationBuilder builder = Host.CreateEmptyApplicationBuilder(settings: null);
 
        builder.Services.AddDbContext<TestDbContext>(options => options.UseMongoDB(ConnectionString, DatabaseName));
 
        builder.EnrichMongoDbContext<TestDbContext>();
    }
 
    protected override void SetupConnectionInformationIsDelayValidated()
    {
        Assert.Skip("Enrich doesn't use ConnectionString");
    }
 
    [Fact]
    public void EnrichSupportServiceType()
    {
        var builder = Host.CreateEmptyApplicationBuilder(null);
 
        builder.Services.AddDbContextPool<ITestDbContext, TestDbContext>(optionsBuilder =>
        {
            optionsBuilder.UseMongoDB(ConnectionString, DatabaseName);
        });
 
        builder.EnrichMongoDbContext<TestDbContext>();
 
        using var host = builder.Build();
        var context = host.Services.GetRequiredService<ITestDbContext>() as TestDbContext;
        Assert.NotNull(context);
    }
 
    [Fact]
    public void EnrichSupportCustomOptionsLifetime()
    {
        var builder = Host.CreateEmptyApplicationBuilder(null);
 
        builder.Services.AddDbContext<ITestDbContext, TestDbContext>(optionsBuilder =>
        {
            optionsBuilder.UseMongoDB(ConnectionString, DatabaseName);
        }, contextLifetime: ServiceLifetime.Singleton);
 
        builder.EnrichMongoDbContext<TestDbContext>();
 
        var optionsDescriptor = builder.Services.FirstOrDefault(sd => sd.ServiceType == typeof(DbContextOptions<TestDbContext>));
        Assert.NotNull(optionsDescriptor);
        Assert.Equal(ServiceLifetime.Singleton, optionsDescriptor.Lifetime);
 
        using var host = builder.Build();
        var context = host.Services.GetRequiredService<ITestDbContext>() as TestDbContext;
        Assert.NotNull(context);
    }
 
    [Fact]
    public void EnrichWithNamedAndNonNamedUsesBoth()
    {
        var builder = Host.CreateEmptyApplicationBuilder(null);
        builder.Configuration.AddInMemoryCollection([
            new KeyValuePair<string, string?>("Aspire:MongoDB:EntityFrameworkCore:DisableTracing", "false"),
            new KeyValuePair<string, string?>("Aspire:MongoDB:EntityFrameworkCore:TestDbContext:DisableTracing", "true")
        ]);
 
        builder.Services.AddDbContextPool<TestDbContext>(optionsBuilder =>
        {
            optionsBuilder.UseMongoDB(ConnectionString, DatabaseName);
        });
 
        builder.EnrichMongoDbContext<TestDbContext>();
 
        using var host = builder.Build();
 
        var tracerProvider = host.Services.GetService<TracerProvider>();
        Assert.Null(tracerProvider);
    }
}