using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using TestStartupApi.Data; using TestStartupApi.External; using TestStartupApi.IntegrationTests.Stubs; using TestStartupApi.Messaging; using XBullet.EasyTesting.Authentication; using XBullet.EasyTesting.EntityFrameworkCore; using XBullet.EasyTesting.Messaging; namespace TestStartupApi.IntegrationTests; #region docs-order-workflow-factory public sealed class StartupApiFactory : StartupEntityFrameworkWebApplicationFactory { private readonly string _databaseName = $"startup-api-{Guid.NewGuid():N}"; public StartupApiFactory() { RegisterScenarioResource("External orders", ExternalOrders); RegisterScenarioResource("External customers", ExternalCustomers); RegisterScenarioResource("Post provider", PostProvider); RegisterScenarioResource("Kafka messages", KafkaMessages); } public StubExternalOrdersClient ExternalOrders { get; } = new(); public StubExternalCustomersClient ExternalCustomers { get; } = new(); public StubPostProviderClient PostProvider { get; } = new(); public RecordedMessageBus KafkaMessages { get; } = new(); protected override void ConfigureTestAuthentication( TestAuthenticationSchemeBuilder authentication) => authentication.MapAzureAd("Bearer"); protected override void ConfigureDatabaseServices(IServiceCollection services) => services.AddDbContext(options => options.UseInMemoryDatabase(_databaseName)); protected override void ConfigureScenarioDatabaseServices( IServiceCollection services, XBullet.EasyTesting.Hosting.TestScenarioContext context) => services.AddDbContext(options => options.UseInMemoryDatabase($"{_databaseName}-{context.ScenarioId}")); protected override void ConfigureAdditionalServicesForTests(IServiceCollection services) { services.RemoveAll(); services.AddSingleton(ExternalOrders); services.AddScoped(provider => provider.GetRequiredService()); services.RemoveAll(); services.AddSingleton(ExternalCustomers); services.AddScoped(provider => provider.GetRequiredService()); services.RemoveAll(); services.AddSingleton(PostProvider); services.AddScoped(provider => provider.GetRequiredService()); services.RemoveAll(); services.AddSingleton(new RecordingKafkaPublisher(KafkaMessages)); services.RemoveAll(); services.AddSingleton(new TimeProviderStub( new DateTimeOffset(2026, 9, 17, 12, 0, 0, TimeSpan.Zero))); services.AddSingleton(provider => provider.GetRequiredService()); } private sealed class TimeProviderStub(DateTimeOffset now) : TimeProvider { public override DateTimeOffset GetUtcNow() => now; } } #endregion