using Elsa.AI.Abstractions.Contracts; using Elsa.AI.Abstractions.Models; using Elsa.Extensions; using Elsa.AI.Persistence.EFCore.Stores; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; namespace Elsa.AI.Persistence.EFCore.UnitTests; public class AIPersistenceRegistrationTests { [Fact(DisplayName = "AI persistence store registration configures DbContext")] public void AIPersistenceStoreRegistrationConfiguresDbContext() { using var connection = new SqliteConnection("DataSource=:memory:"); var services = new ServiceCollection(); services.AddAIPersistenceStores(options => options.UseSqlite(connection)); using var provider = services.BuildServiceProvider(new ServiceProviderOptions { ValidateScopes = true }); using var scope = provider.CreateScope(); Assert.NotNull(scope.ServiceProvider.GetRequiredService()); Assert.NotNull(scope.ServiceProvider.GetRequiredService()); Assert.IsType(scope.ServiceProvider.GetRequiredService()); } [Fact(DisplayName = "AI persistence store registration replaces existing conversation store")] public void AIPersistenceStoreRegistrationReplacesExistingConversationStore() { using var connection = new SqliteConnection("DataSource=:memory:"); var services = new ServiceCollection(); services.AddSingleton(); services.AddSingleton(); services.AddAIPersistenceStores(options => options.UseSqlite(connection)); using var provider = services.BuildServiceProvider(new ServiceProviderOptions { ValidateScopes = true }); using var scope = provider.CreateScope(); Assert.IsType(scope.ServiceProvider.GetRequiredService()); Assert.IsType(scope.ServiceProvider.GetRequiredService()); } [Fact(DisplayName = "AI persistence store registration requires a DbContext provider")] public void AIPersistenceStoreRegistrationRequiresDbContextProvider() { var services = new ServiceCollection(); Assert.Throws(() => services.AddAIPersistenceStores()); } [Fact(DisplayName = "AI persistence store registration uses preconfigured DbContext options")] public void AIPersistenceStoreRegistrationUsesPreconfiguredDbContextOptions() { using var connection = new SqliteConnection("DataSource=:memory:"); var services = new ServiceCollection(); services.AddSingleton(new DbContextOptionsBuilder().UseSqlite(connection).Options); services.AddAIPersistenceStores(); using var provider = services.BuildServiceProvider(new ServiceProviderOptions { ValidateScopes = true }); using var scope = provider.CreateScope(); Assert.NotNull(scope.ServiceProvider.GetRequiredService()); Assert.IsType(scope.ServiceProvider.GetRequiredService()); } private class StubConversationStore : IAIConversationStore { public ValueTask FindAsync(string id, CancellationToken cancellationToken = default) => ValueTask.FromResult(null); public ValueTask SaveAsync(AIConversation conversation, CancellationToken cancellationToken = default) => ValueTask.CompletedTask; } private class StubProposalStore : IAIProposalStore { public ValueTask FindAsync(string id, string? tenantId, CancellationToken cancellationToken = default) => ValueTask.FromResult(null); public ValueTask SaveAsync(AIProposal proposal, CancellationToken cancellationToken = default) => ValueTask.CompletedTask; } }