Add unit and integration tests for the Finish activity to validate termination behavior (#7110) (#7114)

* Add unit and integration tests for the `Finish` activity to validate termination behavior (#7110)

- Added `FinishInSequenceWorkflow` to test `Finish` activity in a sequence workflow configuration.
- Introduced integration tests (`FinishTests`) to confirm `Finish` terminates workflows and skips subsequent activities.
- Developed unit tests to verify activity completion and workflow status transitions to `Finished`.

* Update test/integration/Elsa.Activities.IntegrationTests/Primitives/Workflows/FinishInSequenceWorkflow.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update test/integration/Elsa.Activities.IntegrationTests/Primitives/Workflows/FinishInSequenceWorkflow.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Add `Finish` activity unit test to verify ITerminalNode implementation

* Add code coverage report generation and GitHub Pages deployment workflow

- Removed unused `tempvalidator` project and its associated files.
- Updated GitHub Actions workflow to include steps for generating code coverage reports in HTML format using `dotnet-reportgenerator-globaltool`.
- Added deployment of coverage reports to GitHub Pages for the `main` branch.
- Updated `.gitignore` to exclude test results and artifacts.

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Sipke Schoorstra 2025-11-27 20:51:59 +01:00 committed by GitHub
parent 8f35cab2ad
commit 4ee8f6912d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 148 additions and 12 deletions

View file

@ -70,6 +70,17 @@ jobs:
dotnet test "$project" --configuration Release --no-build --logger "GitHubActions;report-warnings=false" /p:CollectCoverage=true
done
- name: Install ReportGenerator
run: dotnet tool install -g dotnet-reportgenerator-globaltool
- name: Generate HTML coverage report
run: |
reportgenerator \
"-reports:./artifacts/coverage/**/coverage.cobertura.xml" \
"-targetdir:./artifacts/coverage-report" \
"-reporttypes:Html;Cobertura;TextSummary" \
"-verbosity:Info"
- name: Upload coverage reports
if: always()
uses: actions/upload-artifact@v4
@ -77,6 +88,12 @@ jobs:
name: coverage-reports
path: artifacts/coverage
- name: Upload Pages artifact
if: always() && github.ref == 'refs/heads/main'
uses: actions/upload-pages-artifact@v3
with:
path: './artifacts/coverage-report'
build:
name: Build packages
needs: test
@ -168,3 +185,19 @@ jobs:
- name: Publish to nuget.org
run: dotnet nuget push *.nupkg -k ${{ secrets.NUGET_API_KEY }} -s ${{ env.nuget_feed_source }} --skip-duplicate
deploy_coverage:
name: Deploy coverage to GitHub Pages
needs: test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4

4
.gitignore vendored
View file

@ -80,3 +80,7 @@ unlist.sh
/docker/data/
/docker/azurite-data/
docker/docker-compose-datadog.yml
# Test results
TestResults/
artifacts/

View file

@ -1,2 +0,0 @@
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

View file

@ -1,10 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View file

@ -0,0 +1,36 @@
using Elsa.Activities.IntegrationTests.Primitives.Workflows;
using Elsa.Testing.Shared;
using Elsa.Workflows;
using Elsa.Workflows.Activities;
using Elsa.Workflows.State;
using Xunit.Abstractions;
namespace Elsa.Activities.IntegrationTests.Primitives;
/// <summary>
/// Integration tests for the <see cref="Finish"/> activity.
/// </summary>
public class FinishTests(ITestOutputHelper testOutputHelper)
{
private readonly WorkflowTestFixture _fixture = new WorkflowTestFixture(testOutputHelper)
.AddWorkflow<FinishInSequenceWorkflow>();
[Fact(DisplayName = "Finish terminates workflow and prevents subsequent activities from executing")]
public async Task Finish_TerminatesWorkflowAndPreventsSubsequentActivities()
{
// Act
var workflowState = await _fixture.RunWorkflowAsync(FinishInSequenceWorkflow.DefinitionId);
// Assert
AssertWorkflowFinished(workflowState);
var lines = _fixture.CapturingTextWriter.Lines.ToList();
Assert.Contains("Before Finish", lines);
Assert.DoesNotContain("After Finish", lines);
}
private static void AssertWorkflowFinished(WorkflowState workflowState)
{
Assert.Equal(WorkflowStatus.Finished, workflowState.Status);
Assert.Equal(WorkflowSubStatus.Finished, workflowState.SubStatus);
}
}

View file

@ -0,0 +1,24 @@
using Elsa.Workflows;
using Elsa.Workflows.Activities;
using System;
namespace Elsa.Activities.IntegrationTests.Primitives.Workflows;
public class FinishInSequenceWorkflow : WorkflowBase
{
public static readonly string DefinitionId = Guid.NewGuid().ToString();
protected override void Build(IWorkflowBuilder workflow)
{
workflow.WithDefinitionId(DefinitionId);
workflow.Root = new Sequence
{
Activities =
{
new WriteLine("Before Finish"),
new Finish(),
new WriteLine("After Finish")
}
};
}
}

View file

@ -0,0 +1,51 @@
using Elsa.Testing.Shared;
using Elsa.Workflows;
namespace Elsa.Activities.UnitTests.Primitives;
/// <summary>
/// Unit tests for the <see cref="Finish"/> activity.
/// </summary>
public class FinishTests
{
[Fact(DisplayName = "Finish implements ITerminalNode interface")]
public void Finish_ImplementsITerminalNode()
{
// Arrange
var finish = new Finish();
// Assert
Assert.IsAssignableFrom<ITerminalNode>(finish);
}
[Fact(DisplayName = "Finish completes successfully")]
public async Task Should_Complete_Successfully()
{
// Arrange
var finish = new Finish();
// Act
var context = await ExecuteAsync(finish);
// Assert
Assert.Equal(ActivityStatus.Completed, context.Status);
}
[Fact(DisplayName = "Finish transitions workflow to Finished substatus")]
public async Task Should_Transition_Workflow_To_Finished()
{
// Arrange
var finish = new Finish();
// Act
var context = await ExecuteAsync(finish);
// Assert
Assert.Equal(WorkflowSubStatus.Finished, context.WorkflowExecutionContext.SubStatus);
}
private static async Task<ActivityExecutionContext> ExecuteAsync(IActivity activity)
{
return await new ActivityTestFixture(activity).ExecuteAsync();
}
}