Skip to content

Testing

viamu edited this page Mar 1, 2026 · 3 revisions

๐Ÿงช Testing

Test Stack

Tool Purpose
xUnit Test framework
NSubstitute Mocking library
FluentAssertions Assertion library

โ–ถ๏ธ Running Tests

# Run all tests
dotnet test

# Run with verbose output
dotnet test --verbosity normal

# Run a specific test class
dotnet test --filter "FullyQualifiedName~CollectionParserTests"

# Run tests from a specific namespace
dotnet test --filter "Namespace~CodeGenesis.Engine.Tests.Claude"

๐Ÿ“Š Test Coverage

Test Class Target Tests
UsePipelineStepTests Sub-pipeline execution, input mapping, output merging, circular detection 20
DynamicStepTests Success/failure execution, retry, rate limit, fail_if, clone 20
PipelineConfigLoaderTests Template resolution, YAML loading, validation 20
ClaudeResponseTests JSON parsing, FailureKind classification, Failure factory 15
CollectionParserTests JSON array, comma-separated, newline-separated, fallbacks 12
StepEntryTests Discriminators (IsSimpleStep, IsForeach, etc.), ToStepConfig 11
McpServerConfigTests Template resolution, immutability 10
McpContextBuilderTests MCP tools section generation for system prompts 9
PipelineContextTests Initialization, metrics accumulation, step outputs 6
StepResultTests Record equality, outcome values 6
RetryPolicyTests Cascading resolution (step โ†’ global โ†’ defaults) 4
Total 133

๐Ÿ”„ CI

Tests run automatically via GitHub Actions on every push to main and on pull requests.

CI

The workflow:

  1. โ˜‘๏ธ Sets up .NET 10 SDK (10.0.103)
  2. โ˜‘๏ธ Restores dependencies
  3. โ˜‘๏ธ Builds in Release configuration
  4. โ˜‘๏ธ Runs all tests

โœ๏ธ Writing New Tests

Conventions

Convention Example
File location Mirror source namespace (Claude/, Config/, Pipeline/, Steps/)
Test naming MethodName_Scenario_ExpectedResult
Mocking Use NSubstitute for interfaces (IClaudeRunner, IStepExecutor)
Assertions Use FluentAssertions (result.Should().Be(...))

Example

[Fact]
public async Task ExecuteAsync_Success_ReturnsSuccessResult()
{
    // Arrange
    _claude.RunAsync(Arg.Any<ClaudeRequest>(), Arg.Any<CancellationToken>())
        .Returns(new ClaudeResponse
        {
            Success = true,
            Result = "done!",
            InputTokens = 100,
            OutputTokens = 50,
            CostUsd = 0.01,
            Duration = TimeSpan.FromSeconds(2)
        });

    var step = MakeStep();
    var ctx = MakeContext();

    // Act
    var result = await step.ExecuteAsync(ctx, CancellationToken.None);

    // Assert
    result.Outcome.Should().Be(StepOutcome.Success);
    result.Output.Should().Be("done!");
}

Tip

When testing steps that depend on IClaudeRunner, use NSubstitute.Returns() to simulate different Claude responses (success, timeout, rate limit, max_turns, etc.).

๐Ÿงฌ CodeGenesis

๐Ÿ  Home


๐Ÿ“˜ Guides

๐Ÿ“‹ Pipeline

๐Ÿ”ง Internals


CI

Clone this wiki locally