Merge branch 'develop/3.6.0' into feat/tests-http-endpoint

This commit is contained in:
lucas.hipolito 2025-12-02 15:37:59 +01:00
commit ae2a3cb3b5
3 changed files with 60 additions and 115 deletions

View file

@ -13,6 +13,36 @@
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4"/>
<PackageVersion Include="Npgsql" Version="9.0.4"/>
<PackageVersion Include="Oracle.EntityFrameworkCore" Version="9.23.26000"/>
<PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="9.0.11"/>
<PackageVersion Include="Microsoft.AspNetCore.Components" Version="9.0.11"/>
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.11"/>
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="9.0.11"/>
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="9.0.11"/>
<PackageVersion Include="Microsoft.AspNetCore.DataProtection.Abstractions" Version="9.0.11"/>
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Data.Sqlite" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Data.Sqlite.Core" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.DependencyModel" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.Http" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.Http.Polly" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.Logging" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.Options" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="9.0.11"/>
<PackageVersion Include="Microsoft.Extensions.Resilience" Version="9.0.11"/>
<PackageVersion Include="Scrutor" Version="6.1.0"/>
<PackageVersion Include="System.Formats.Asn1" Version="9.0.11"/>
<PackageVersion Include="System.Text.Json" Version="9.0.11"/>
</ItemGroup>
<!-- .NET 10 specific package versions -->
<ItemGroup Condition="'$(TargetFramework)' == 'net10.0'">
@ -24,6 +54,36 @@
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="10.0.0"/>
<PackageVersion Include="Npgsql" Version="10.0.0"/>
<PackageVersion Include="Oracle.EntityFrameworkCore" Version="10.23.26000"/>
<PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="10.0.0"/>
<PackageVersion Include="Microsoft.AspNetCore.Components" Version="10.0.0"/>
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.0"/>
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.0"/>
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="10.0.0"/>
<PackageVersion Include="Microsoft.AspNetCore.DataProtection.Abstractions" Version="10.0.0"/>
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Data.Sqlite" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Data.Sqlite.Core" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.DependencyModel" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Http" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Http.Polly" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Options" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Resilience" Version="10.0.0"/>
<PackageVersion Include="Scrutor" Version="7.0.0"/>
<PackageVersion Include="System.Formats.Asn1" Version="10.0.0"/>
<PackageVersion Include="System.Text.Json" Version="10.0.0"/>
</ItemGroup>
<ItemGroup>
<PackageVersion Include="AspNetCore.Authentication.ApiKey" Version="9.0.0"/>
@ -63,36 +123,9 @@
<PackageVersion Include="MassTransit.Azure.ServiceBus.Core" Version="8.5.7"/>
<PackageVersion Include="MassTransit.Extensions.DependencyInjection" Version="7.3.1"/>
<PackageVersion Include="MassTransit.RabbitMQ" Version="8.5.7"/>
<PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="10.0.0"/>
<PackageVersion Include="Microsoft.AspNetCore.Components" Version="10.0.0"/>
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.0"/>
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.0"/>
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="10.0.0"/>
<PackageVersion Include="Microsoft.AspNetCore.DataProtection.Abstractions" Version="10.0.0"/>
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.0"/>
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6"/>
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="5.0.0"/>
<PackageVersion Include="Microsoft.Data.SqlClient" Version="6.1.3"/>
<PackageVersion Include="Microsoft.Data.Sqlite" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Data.Sqlite.Core" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.DependencyModel" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Http" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Http.Polly" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Options" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Extensions.Resilience" Version="10.0.0"/>
<PackageVersion Include="Microsoft.Identity.Client" Version="4.79.2"/>
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.1"/>
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All"/>
@ -122,7 +155,6 @@
<PackageVersion Include="pythonnet" Version="3.1.0-preview2024-09-06"/>
<PackageVersion Include="Refit" Version="9.0.2"/>
<PackageVersion Include="Refit.HttpClientFactory" Version="9.0.2"/>
<PackageVersion Include="Scrutor" Version="7.0.0"/>
<PackageVersion Include="Serilog" Version="4.3.0"/>
<PackageVersion Include="Serilog.Extensions.Logging" Version="10.0.0"/>
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0"/>
@ -135,8 +167,6 @@
<PackageVersion Include="System.Linq.Dynamic.Core" Version="1.7.1"/>
<PackageVersion Include="System.Net.Http" Version="4.3.4"/>
<PackageVersion Include="System.Text.RegularExpressions" Version="4.3.1"/>
<PackageVersion Include="System.Formats.Asn1" Version="10.0.0"/>
<PackageVersion Include="System.Text.Json" Version="10.0.0"/>
<PackageVersion Include="Testcontainers" Version="4.9.0"/>
<PackageVersion Include="Testcontainers.PostgreSql" Version="4.9.0"/>
<PackageVersion Include="Testcontainers.RabbitMq" Version="4.9.0"/>

View file

@ -1,59 +0,0 @@
using System;
using System.Threading.Tasks;
using Elsa.Testing.Extensions;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.Extensions.Hosting;
using Xunit;
namespace Sample;
/// <summary>
/// Sample integration test showing how to properly shutdown Elsa background tasks.
/// </summary>
/// <typeparam name="TStartup">The startup class of your application.</typeparam>
public class IntegrationTestBase<TStartup> : IAsyncDisposable where TStartup : class
{
protected readonly WebApplicationFactory<TStartup> Factory;
public IntegrationTestBase()
{
Factory = new WebApplicationFactory<TStartup>();
// ... other initialization code
}
public async ValueTask DisposeAsync()
{
// Explicitly stop Elsa background tasks before disposing the factory
await Factory.ShutdownElsaAsync();
// Then stop the server and host
if (Factory.Server?.Host != null)
{
await Factory.Server.Host.StopAsync();
}
Factory.Dispose();
GC.SuppressFinalize(this);
}
}
/// <summary>
/// Example test class inheriting from the base integration test class.
/// </summary>
public class ExampleIntegrationTest : IntegrationTestBase<TestStartup>
{
[Fact]
public async Task SampleTest()
{
// Test logic here
await Task.CompletedTask;
}
}
/// <summary>
/// Sample startup class for demonstration purposes.
/// </summary>
public class TestStartup
{
// This is just a placeholder class for the example
}

View file

@ -1,26 +0,0 @@
# Elsa Integration Testing Examples
This directory contains samples and examples showing best practices for integration testing with Elsa Workflows.
## Properly Shutting Down Elsa Background Tasks in Integration Tests
When using ASP.NET Core's `WebApplicationFactory<TStartup>` in integration tests with Elsa Workflows, it's important to properly shut down Elsa's background tasks before disposing the factory. Failure to do so can result in task crashes and errors when the test host is stopped, especially if your test drops or disposes databases.
### The Issue
Elsa uses background tasks and recurring tasks for various purposes, such as bookmark processing and workflow execution. These tasks continue running in the background, and when the test host is abruptly shut down without properly deactivating them, they may attempt to access resources (like databases) that have already been disposed or dropped, resulting in errors.
### The Solution
The `WebApplicationFactoryExtensions` class provides an extension method `ShutdownElsaAsync<TEntryPoint>` that properly shuts down all Elsa background tasks by deactivating the tenants. This should be called in your test teardown code before stopping and disposing the factory.
```csharp
// In your test's Dispose or DisposeAsync method:
await factory.ShutdownElsaAsync();
```
See the `IntegrationTestSample.cs` file for a complete example of a base test class that properly handles Elsa shutdown.
### Best Practice
Always shut down Elsa tasks explicitly before stopping and disposing your `WebApplicationFactory` in integration tests, especially if your test uses real databases that might be dropped after each test.