Fix #1501: Generate WhenStateIs/WillSetStateTo correctly in ToCSharpCode (#1502)

* Fix #1501: Generate WhenStateIs/WillSetStateTo correctly in ToCSharpCode

* Fix matcher to code converters. Refactor changes.

* Adjust test artifacts.

* Return fully qualified class names for matchers
This commit is contained in:
Dmytro Nikitin
2026-08-19 19:58:47 +02:00
committed by GitHub
parent 42353f035e
commit 2b165eb6a1
40 changed files with 334 additions and 113 deletions
@@ -1,5 +1,6 @@
// Copyright © WireMock.Net
using WireMock.Matchers;
using WireMock.Matchers.Request;
using WireMock.Net.Tests.VerifyExtensions;
using WireMock.RequestBuilders;
@@ -97,6 +98,167 @@ public partial class MappingConverterTests
return Verify(code, VerifySettings);
}
[Fact]
public Task ToCSharpCode_With_ScenarioAndState_Emits_WhenStateIs_And_WillSetStateTo()
{
// Assign: a stateful mapping that gates on state "Begin" and moves to "End" after 3 hits.
var mapping = CreateScenarioMapping("Ordering", executionConditionState: "Begin", nextState: "End", timesInSameState: 3);
// Act
var code = _sut.ToCSharpCode(mapping, new MappingConverterSettings
{
AddStart = false,
ConverterType = MappingConverterType.Server
});
// Verify
return Verify(code, VerifySettings);
}
[Fact]
public Task ToCSharpCode_With_NextStateOnly_Emits_WillSetStateTo_Without_Times()
{
// Assign: a start-state mapping that only sets the next state (no execution condition, default times).
var mapping = CreateScenarioMapping("Ordering", executionConditionState: null, nextState: "Begin", timesInSameState: null);
// Act
var code = _sut.ToCSharpCode(mapping, new MappingConverterSettings
{
AddStart = false,
ConverterType = MappingConverterType.Server
});
// Verify
return Verify(code, VerifySettings);
}
[Fact]
public Task ToCSharpCode_WithPath_RegexMatcher_MultiplePatterns()
{
// Assign
var mapping = CreateMappingWithRequest(Request.Create()
.UsingGet()
.WithPath(new RegexMatcher(MatchBehaviour.AcceptOnMatch, ["/a", "/b"])));
// Act
var code = _sut.ToCSharpCode(mapping, new MappingConverterSettings
{
AddStart = false,
ConverterType = MappingConverterType.Server
});
// Verify
return Verify(code, VerifySettings);
}
[Fact]
public Task ToCSharpCode_WithPath_SimMetricsMatcher_MultiplePatterns()
{
// Assign
var mapping = CreateMappingWithRequest(Request.Create()
.UsingGet()
.WithPath(new SimMetricsMatcher(new AnyOfTypes.AnyOf<string, Models.StringPattern>[] { "/a", "/b" })));
// Act
var code = _sut.ToCSharpCode(mapping, new MappingConverterSettings
{
AddStart = false,
ConverterType = MappingConverterType.Server
});
// Verify
return Verify(code, VerifySettings);
}
[Fact]
public Task ToCSharpCode_WithPath_ContentTypeMatcher_MultiplePatterns()
{
// Assign
var mapping = CreateMappingWithRequest(Request.Create()
.UsingGet()
.WithPath(new ContentTypeMatcher(["text/a", "text/b"])));
// Act
var code = _sut.ToCSharpCode(mapping, new MappingConverterSettings
{
AddStart = false,
ConverterType = MappingConverterType.Server
});
// Verify
return Verify(code, VerifySettings);
}
[Fact]
public Task ToCSharpCode_WithPath_FormUrlEncodedMatcher_MultiplePatterns()
{
// Assign
var mapping = CreateMappingWithRequest(Request.Create()
.UsingGet()
.WithPath(new FormUrlEncodedMatcher(["a=1", "b=2"])));
// Act
var code = _sut.ToCSharpCode(mapping, new MappingConverterSettings
{
AddStart = false,
ConverterType = MappingConverterType.Server
});
// Verify
return Verify(code, VerifySettings);
}
private Mapping CreateMappingWithRequest(IRequestBuilder requestBuilder)
{
return new Mapping
(
guid: new Guid("8e7b9ab7-e18e-4502-8bc9-11e6679811cc"),
updatedAt: _updatedAt,
title: string.Empty,
description: string.Empty,
path: null,
settings: _settings,
requestMatcher: (IRequestMatcher)requestBuilder,
provider: Response.Create().WithSuccess(),
priority: 0,
scenario: null,
executionConditionState: null,
nextState: null,
stateTimes: null,
webhooks: null,
useWebhooksFireAndForget: false,
timeSettings: null,
data: null
);
}
private Mapping CreateScenarioMapping(string scenario, string? executionConditionState, string? nextState, int? timesInSameState)
{
var request = Request.Create().UsingGet().WithPath("/test_path");
var response = Response.Create().WithSuccess();
return new Mapping
(
guid: new Guid("8e7b9ab7-e18e-4502-8bc9-11e6679811cc"),
updatedAt: _updatedAt,
title: string.Empty,
description: string.Empty,
path: null,
settings: _settings,
requestMatcher: request,
provider: response,
priority: 0,
scenario: scenario,
executionConditionState: executionConditionState,
nextState: nextState,
stateTimes: timesInSameState,
webhooks: null,
useWebhooksFireAndForget: false,
timeSettings: null,
data: null
);
}
private IMapping CreateMapping()
{
var guid = new Guid("8e7b9ab7-e18e-4502-8bc9-11e6679811cc");
@@ -117,22 +279,22 @@ public partial class MappingConverterTests
return new Mapping
(
guid,
_updatedAt,
string.Empty,
string.Empty,
null,
_settings,
request,
response,
42,
null,
null,
null,
null,
null,
false,
null,
guid: guid,
updatedAt: _updatedAt,
title: string.Empty,
description: string.Empty,
path: null,
settings: _settings,
requestMatcher: request,
provider: response,
priority: 42,
scenario: null,
executionConditionState: null,
nextState: null,
stateTimes: null,
webhooks: null,
useWebhooksFireAndForget: false,
timeSettings: null,
data: null
).WithProbability(0.3);
}