using System.Data.Common; using Elsa.Diagnostics.StructuredLogs.Contracts; using Elsa.Diagnostics.StructuredLogs.Persistence.Relational.Contracts; using Elsa.Diagnostics.StructuredLogs.Persistence.Relational.Extensions; using Microsoft.Extensions.DependencyInjection; namespace Elsa.Diagnostics.StructuredLogs.Persistence.Relational.UnitTests; public class RelationalStructuredLogServiceCollectionExtensionsTests { [Fact] public async Task AddRelationalStructuredLogPersistence_WhenCalledTwice_DoesNotDuplicateRelationalRegistrations() { var services = new ServiceCollection(); services.AddSingleton(); services.AddSingleton(); services.AddRelationalStructuredLogPersistence(); var diagnosticsCount = Count(services); var storeCount = Count(services); var writeBufferCount = Count(services); services.AddRelationalStructuredLogPersistence(); Assert.Equal(diagnosticsCount, Count(services)); Assert.Equal(storeCount, Count(services)); Assert.Equal(writeBufferCount, Count(services)); await using var serviceProvider = services.BuildServiceProvider(); Assert.NotNull(serviceProvider.GetRequiredService()); } private static int Count(IEnumerable services) => services.Count(x => x.ServiceType == typeof(T)); private class FakeConnectionFactory : IRelationalStructuredLogConnectionFactory { public ValueTask OpenConnectionAsync(CancellationToken cancellationToken = default) { throw new NotSupportedException(); } } private class FakeDialect : IRelationalStructuredLogDialect { public string ProviderName => "Fake"; public string ParameterPrefix => "@"; public string QuoteIdentifier(string identifier) => identifier; public string ApplyLimit(string sql, int limit) => sql; public string ApplyOffset(string sql, int offset) => sql; } }