mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-03-22 09:30:18 +01:00
Use latest ProtoBufJsonConverter to support WellKnownTypes (#1161)
* Use latest ProtoBufJsonConverter to support WellKnownTypes * Fix * 02 * WireMockServer_WithBodyAsProtoBuf_WithWellKnownTypes * . * extra test * 0.4.0-preview-06 * 7 * <PackageReference Include="ProtoBufJsonConverter" Version="0.4.0-preview-08" /> * Update README.md * <PackageReference Include="ProtoBufJsonConverter" Version="0.4.0-preview-09" /> * <PackageReference Include="ProtoBufJsonConverter" Version="0.4.0" /> * Update README.md
This commit is contained in:
@@ -35,6 +35,69 @@ message HelloRequest {
|
||||
message HelloReply {
|
||||
string message = 1;
|
||||
}
|
||||
";
|
||||
|
||||
private const string ProtoDefinitionWithWellKnownTypes = @"
|
||||
syntax = ""proto3"";
|
||||
|
||||
package communication.api.v1;
|
||||
|
||||
import ""google/protobuf/empty.proto"";
|
||||
import ""google/protobuf/timestamp.proto"";
|
||||
import ""google/protobuf/duration.proto"";
|
||||
|
||||
service Greeter {
|
||||
rpc SayNothing (google.protobuf.Empty) returns (google.protobuf.Empty);
|
||||
}
|
||||
|
||||
message MyMessageTimestamp {
|
||||
google.protobuf.Timestamp ts = 1;
|
||||
}
|
||||
|
||||
message MyMessageDuration {
|
||||
google.protobuf.Duration du = 1;
|
||||
}
|
||||
";
|
||||
|
||||
private const string ProtoDefinitionMain = @"
|
||||
syntax = ""proto3"";
|
||||
|
||||
package greet;
|
||||
|
||||
import ""other.proto"";
|
||||
import ""google/protobuf/empty.proto"";
|
||||
|
||||
service Greeter {
|
||||
rpc Nothing (google.protobuf.Empty) returns (google.protobuf.Empty);
|
||||
|
||||
rpc SayHello (HelloRequest) returns (HelloReply);
|
||||
|
||||
rpc SayOther (Other) returns (HelloReply);
|
||||
}
|
||||
|
||||
message HelloRequest {
|
||||
string name = 1;
|
||||
}
|
||||
|
||||
message HelloReply {
|
||||
string message = 1;
|
||||
}
|
||||
|
||||
message Person {
|
||||
string name = 1;
|
||||
int32 id = 2;
|
||||
string email = 3;
|
||||
}
|
||||
";
|
||||
|
||||
private const string ProtoDefinitionOther = @"// other.proto
|
||||
syntax = ""proto3"";
|
||||
|
||||
package greet;
|
||||
|
||||
message Other {
|
||||
string name = 1;
|
||||
}
|
||||
";
|
||||
|
||||
[Theory]
|
||||
@@ -80,6 +143,129 @@ message HelloReply {
|
||||
server.Stop();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task WireMockServer_WithBodyAsProtoBuf_WithWellKnownTypes()
|
||||
{
|
||||
// Arrange
|
||||
var bytes = Convert.FromBase64String("CgRzdGVm");
|
||||
|
||||
using var server = WireMockServer.Start();
|
||||
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.UsingPost()
|
||||
.WithPath("/grpc/Greeter/SayNothing")
|
||||
.WithBody(new NotNullOrEmptyMatcher())
|
||||
)
|
||||
.RespondWith(Response.Create()
|
||||
.WithBodyAsProtoBuf(ProtoDefinitionWithWellKnownTypes, "google.protobuf.Empty",
|
||||
new { }
|
||||
)
|
||||
.WithTrailingHeader("grpc-status", "0")
|
||||
.WithTransformer()
|
||||
);
|
||||
|
||||
// Act
|
||||
var protoBuf = new ByteArrayContent(bytes);
|
||||
protoBuf.Headers.ContentType = new MediaTypeHeaderValue("application/grpc-web");
|
||||
|
||||
var client = server.CreateClient();
|
||||
var response = await client.PostAsync("/grpc/Greeter/SayNothing", protoBuf);
|
||||
|
||||
// Assert
|
||||
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
||||
var responseBytes = await response.Content.ReadAsByteArrayAsync();
|
||||
|
||||
Convert.ToBase64String(responseBytes).Should().Be("");
|
||||
|
||||
server.Stop();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task WireMockServer_WithBodyAsProtoBuf_ServerProtoDefinition_WithWellKnownTypes()
|
||||
{
|
||||
// Arrange
|
||||
var bytes = Convert.FromBase64String("CgRzdGVm");
|
||||
|
||||
using var server = WireMockServer.Start();
|
||||
|
||||
var id = $"proto-{Guid.NewGuid()}";
|
||||
|
||||
server
|
||||
.AddProtoDefinition(id, ProtoDefinitionWithWellKnownTypes)
|
||||
.Given(Request.Create()
|
||||
.UsingPost()
|
||||
.WithPath("/grpc/Greeter/SayNothing")
|
||||
.WithBody(new NotNullOrEmptyMatcher())
|
||||
)
|
||||
.WithProtoDefinition(id)
|
||||
.RespondWith(Response.Create()
|
||||
.WithBodyAsProtoBuf("google.protobuf.Empty",
|
||||
new { }
|
||||
)
|
||||
.WithTrailingHeader("grpc-status", "0")
|
||||
.WithTransformer()
|
||||
);
|
||||
|
||||
// Act
|
||||
var protoBuf = new ByteArrayContent(bytes);
|
||||
protoBuf.Headers.ContentType = new MediaTypeHeaderValue("application/grpc-web");
|
||||
|
||||
var client = server.CreateClient();
|
||||
var response = await client.PostAsync("/grpc/Greeter/SayNothing", protoBuf);
|
||||
|
||||
// Assert
|
||||
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
||||
var responseBytes = await response.Content.ReadAsByteArrayAsync();
|
||||
|
||||
Convert.ToBase64String(responseBytes).Should().Be("");
|
||||
|
||||
server.Stop();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task WireMockServer_WithBodyAsProtoBuf_MultipleFiles()
|
||||
{
|
||||
// Arrange
|
||||
var bytes = Convert.FromBase64String("CgRzdGVm");
|
||||
var jsonMatcher = new JsonMatcher(new { name = "stef" });
|
||||
|
||||
using var server = WireMockServer.Start();
|
||||
|
||||
var protoFiles = new [] { ProtoDefinitionMain, ProtoDefinitionOther };
|
||||
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.UsingPost()
|
||||
.WithPath("/grpc/greet.Greeter/SayOther")
|
||||
.WithBodyAsProtoBuf(protoFiles, "greet.Other", jsonMatcher)
|
||||
)
|
||||
.RespondWith(Response.Create()
|
||||
.WithBodyAsProtoBuf(protoFiles, "greet.HelloReply",
|
||||
new
|
||||
{
|
||||
message = "hello"
|
||||
}
|
||||
)
|
||||
.WithTrailingHeader("grpc-status", "0")
|
||||
);
|
||||
|
||||
// Act
|
||||
var protoBuf = new ByteArrayContent(bytes);
|
||||
protoBuf.Headers.ContentType = new MediaTypeHeaderValue("application/grpc-web");
|
||||
|
||||
var client = server.CreateClient();
|
||||
var response = await client.PostAsync("/grpc/greet.Greeter/SayOther", protoBuf);
|
||||
|
||||
// Assert
|
||||
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
||||
var responseBytes = await response.Content.ReadAsByteArrayAsync();
|
||||
|
||||
Convert.ToBase64String(responseBytes).Should().Be("AAAAAAcKBWhlbGxv");
|
||||
|
||||
server.Stop();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task WireMockServer_WithBodyAsProtoBuf_InlineProtoDefinition_UsingGrpcGeneratedClient()
|
||||
{
|
||||
|
||||
@@ -14,7 +14,8 @@ namespace WireMock.Net.Tests.Matchers;
|
||||
public class ProtoBufMatcherTests
|
||||
{
|
||||
private const string MessageType = "greet.HelloRequest";
|
||||
private readonly IdOrText _protoDefinition = new(null, @"
|
||||
|
||||
private static IdOrTexts ProtoDefinition => new(null, @"
|
||||
syntax = ""proto3"";
|
||||
|
||||
package greet;
|
||||
@@ -30,7 +31,7 @@ message HelloRequest {
|
||||
message HelloReply {
|
||||
string message = 1;
|
||||
}
|
||||
");
|
||||
" + "\r\n// Dummy " + Guid.NewGuid());
|
||||
|
||||
[Fact]
|
||||
public async Task ProtoBufMatcher_For_ValidProtoBuf_And_ValidMethod_DecodeAsync()
|
||||
@@ -39,7 +40,7 @@ message HelloReply {
|
||||
var bytes = Convert.FromBase64String("CgRzdGVm");
|
||||
|
||||
// Act
|
||||
var matcher = new ProtoBufMatcher(() => _protoDefinition, MessageType);
|
||||
var matcher = new ProtoBufMatcher(() => ProtoDefinition, MessageType);
|
||||
var result = await matcher.DecodeAsync(bytes).ConfigureAwait(false);
|
||||
|
||||
// Assert
|
||||
@@ -53,7 +54,7 @@ message HelloReply {
|
||||
var bytes = Convert.FromBase64String("CgRzdGVm");
|
||||
|
||||
// Act
|
||||
var matcher = new ProtoBufMatcher(() => _protoDefinition, MessageType);
|
||||
var matcher = new ProtoBufMatcher(() => ProtoDefinition, MessageType);
|
||||
var result = await matcher.IsMatchAsync(bytes).ConfigureAwait(false);
|
||||
|
||||
// Assert
|
||||
@@ -69,7 +70,7 @@ message HelloReply {
|
||||
var bytes = Convert.FromBase64String("CgRzdGVm");
|
||||
|
||||
// Act
|
||||
var matcher = new ProtoBufMatcher(() => _protoDefinition, MessageType, matcher: jsonMatcher);
|
||||
var matcher = new ProtoBufMatcher(() => ProtoDefinition, MessageType, matcher: jsonMatcher);
|
||||
var result = await matcher.IsMatchAsync(bytes);
|
||||
|
||||
// Assert
|
||||
@@ -84,7 +85,7 @@ message HelloReply {
|
||||
var bytes = new byte[] { 1, 2, 3 };
|
||||
|
||||
// Act
|
||||
var matcher = new ProtoBufMatcher(() => _protoDefinition, MessageType);
|
||||
var matcher = new ProtoBufMatcher(() => ProtoDefinition, MessageType);
|
||||
var result = await matcher.IsMatchAsync(bytes);
|
||||
|
||||
// Assert
|
||||
@@ -99,7 +100,7 @@ message HelloReply {
|
||||
var bytes = Convert.FromBase64String("CgRzdGVm");
|
||||
|
||||
// Act
|
||||
var matcher = new ProtoBufMatcher(() => _protoDefinition, "greet.Greeter.X");
|
||||
var matcher = new ProtoBufMatcher(() => ProtoDefinition, "greet.Greeter.X");
|
||||
var result = await matcher.IsMatchAsync(bytes);
|
||||
|
||||
// Assert
|
||||
|
||||
@@ -42,7 +42,7 @@ message HelloReply {
|
||||
matchers.Should().HaveCount(1);
|
||||
|
||||
var protoBufMatcher = (ProtoBufMatcher)((RequestMessageProtoBufMatcher)matchers[0]).Matcher!;
|
||||
protoBufMatcher.ProtoDefinition().Text.Should().Be(TestProtoDefinition);
|
||||
protoBufMatcher.ProtoDefinition().Texts.Should().Contain(TestProtoDefinition);
|
||||
protoBufMatcher.MessageType.Should().Be(MessageType);
|
||||
protoBufMatcher.Matcher.Should().BeNull();
|
||||
}
|
||||
@@ -59,7 +59,7 @@ message HelloReply {
|
||||
matchers.Should().HaveCount(1);
|
||||
|
||||
var protoBufMatcher = (ProtoBufMatcher)((RequestMessageProtoBufMatcher)matchers[0]).Matcher!;
|
||||
protoBufMatcher.ProtoDefinition().Text.Should().Be(TestProtoDefinition);
|
||||
protoBufMatcher.ProtoDefinition().Texts.Should().Contain(TestProtoDefinition);
|
||||
protoBufMatcher.MessageType.Should().Be(MessageType);
|
||||
protoBufMatcher.Matcher.Should().BeOfType<JsonMatcher>();
|
||||
}
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
Guid: Guid_1,
|
||||
UpdatedAt: 2022-12-04 11:12:13,
|
||||
TimeSettings: {
|
||||
Start: 2023-01-14 15:16:17,
|
||||
End: 2023-01-14 15:17:57,
|
||||
Start: 2023-01-14 15:16:17 Utc,
|
||||
End: 2023-01-14 15:17:57 Utc,
|
||||
TTL: 100
|
||||
},
|
||||
Title: ,
|
||||
|
||||
@@ -226,7 +226,7 @@ message HelloReply {
|
||||
public Task ToMappingModel_WithTimeSettings_ReturnsCorrectTimeSettings()
|
||||
{
|
||||
// Assign
|
||||
var start = new DateTime(2023, 1, 14, 15, 16, 17);
|
||||
var start = new DateTime(2023, 1, 14, 15, 16, 17, DateTimeKind.Utc);
|
||||
var ttl = 100;
|
||||
var end = start.AddSeconds(ttl);
|
||||
var request = Request.Create();
|
||||
|
||||
@@ -102,7 +102,7 @@ public class MatcherMapperTests
|
||||
// Assign
|
||||
var matcherMock = new Mock<IStringMatcher>();
|
||||
matcherMock.Setup(m => m.Name).Returns("test");
|
||||
matcherMock.Setup(m => m.GetPatterns()).Returns(new AnyOf<string, StringPattern>[] { "p1", "p2" });
|
||||
matcherMock.Setup(m => m.GetPatterns()).Returns(["p1", "p2"]);
|
||||
|
||||
// Act
|
||||
var model = _sut.Map(matcherMock.Object)!;
|
||||
@@ -206,7 +206,7 @@ public class MatcherMapperTests
|
||||
public void MatcherMapper_Map_Matcher_ProtoBufMatcher()
|
||||
{
|
||||
// Arrange
|
||||
IdOrText protoDefinition = new(null, @"
|
||||
IdOrTexts protoDefinition = new(null, @"
|
||||
syntax = ""proto3"";
|
||||
|
||||
package greet;
|
||||
@@ -235,7 +235,7 @@ message HelloReply {
|
||||
|
||||
// Assert
|
||||
model.Name.Should().Be(nameof(ProtoBufMatcher));
|
||||
model.Pattern.Should().Be(protoDefinition.Text);
|
||||
model.Pattern.Should().Be(protoDefinition.Texts[0]);
|
||||
model.ProtoBufMessageType.Should().Be(messageType);
|
||||
model.ContentMatcher?.Name.Should().Be("JsonMatcher");
|
||||
model.ContentMatcher?.Pattern.Should().Be(jsonPattern);
|
||||
@@ -246,7 +246,7 @@ message HelloReply {
|
||||
{
|
||||
// Arrange
|
||||
string id = "abc123";
|
||||
IdOrText protoDefinition = new(id, @"
|
||||
IdOrTexts protoDefinition = new(id, @"
|
||||
syntax = ""proto3"";
|
||||
|
||||
package greet;
|
||||
@@ -327,7 +327,7 @@ message HelloReply {
|
||||
var model = new MatcherModel
|
||||
{
|
||||
Name = "LinqMatcher",
|
||||
Patterns = new[] { "p1", "p2" }
|
||||
Patterns = ["p1", "p2"]
|
||||
};
|
||||
|
||||
// Act
|
||||
@@ -362,7 +362,7 @@ message HelloReply {
|
||||
{
|
||||
// Assign
|
||||
var pattern = "{ \"post1\": \"value1\", \"post2\": \"value2\" }";
|
||||
var patterns = new[] { pattern };
|
||||
object[] patterns = [pattern];
|
||||
var model = new MatcherModel
|
||||
{
|
||||
Name = "JsonMatcher",
|
||||
@@ -383,7 +383,7 @@ message HelloReply {
|
||||
// Assign
|
||||
var pattern1 = "{ \"AccountIds\": [ 1, 2, 3 ] }";
|
||||
var pattern2 = "{ \"post1\": \"value1\", \"post2\": \"value2\" }";
|
||||
var patterns = new[] { pattern1, pattern2 };
|
||||
object[] patterns = [pattern1, pattern2];
|
||||
var model = new MatcherModel
|
||||
{
|
||||
Name = "JsonMatcher",
|
||||
@@ -690,7 +690,7 @@ message HelloReply {
|
||||
var model = new MatcherModel
|
||||
{
|
||||
Name = "CSharpCodeMatcher",
|
||||
Patterns = new[] { "return it == \"x\";" }
|
||||
Patterns = ["return it == \"x\";"]
|
||||
};
|
||||
var sut = new MatcherMapper(new WireMockServerSettings { AllowCSharpCodeMatcher = true });
|
||||
|
||||
@@ -716,7 +716,7 @@ message HelloReply {
|
||||
var model = new MatcherModel
|
||||
{
|
||||
Name = "CSharpCodeMatcher",
|
||||
Patterns = new[] { "x" }
|
||||
Patterns = ["x"]
|
||||
};
|
||||
var sut = new MatcherMapper(new WireMockServerSettings { AllowCSharpCodeMatcher = false });
|
||||
|
||||
@@ -734,7 +734,7 @@ message HelloReply {
|
||||
var model = new MatcherModel
|
||||
{
|
||||
Name = "ExactMatcher",
|
||||
Patterns = new[] { "x" }
|
||||
Patterns = ["x"]
|
||||
};
|
||||
|
||||
// Act
|
||||
@@ -751,7 +751,7 @@ message HelloReply {
|
||||
var model = new MatcherModel
|
||||
{
|
||||
Name = "ExactMatcher",
|
||||
Patterns = new[] { "x", "y" }
|
||||
Patterns = ["x", "y"]
|
||||
};
|
||||
|
||||
// Act
|
||||
@@ -819,7 +819,7 @@ message HelloReply {
|
||||
var matcher = (ExactObjectMatcher)_sut.Map(model)!;
|
||||
|
||||
// Assert
|
||||
Check.That((byte[])matcher.Value).ContainsExactly(new byte[] { 115, 116, 101, 102 });
|
||||
Check.That((byte[])matcher.Value).ContainsExactly(115, 116, 101, 102);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -846,7 +846,7 @@ message HelloReply {
|
||||
var model = new MatcherModel
|
||||
{
|
||||
Name = "RegexMatcher",
|
||||
Patterns = new[] { "x", "y" },
|
||||
Patterns = ["x", "y"],
|
||||
IgnoreCase = true,
|
||||
MatchOperator = matchOperator.ToString()
|
||||
};
|
||||
@@ -871,7 +871,7 @@ message HelloReply {
|
||||
var model = new MatcherModel
|
||||
{
|
||||
Name = "WildcardMatcher",
|
||||
Patterns = new[] { "x", "y" },
|
||||
Patterns = ["x", "y"],
|
||||
IgnoreCase = true,
|
||||
MatchOperator = matchOperator.ToString()
|
||||
};
|
||||
@@ -1127,7 +1127,7 @@ message HelloReply {
|
||||
var matcher = (ProtoBufMatcher)_sut.Map(model)!;
|
||||
|
||||
// Assert
|
||||
matcher.ProtoDefinition().Text.Should().Be(protoDefinition);
|
||||
matcher.ProtoDefinition().Texts.Should().ContainSingle(protoDefinition);
|
||||
matcher.Name.Should().Be(nameof(ProtoBufMatcher));
|
||||
matcher.MessageType.Should().Be(messageType);
|
||||
matcher.Matcher?.Value.Should().Be(jsonMatcherPattern);
|
||||
|
||||
@@ -759,8 +759,8 @@ public class WireMockServerProxyTests
|
||||
var brokenJpegHeader = new byte[]
|
||||
{0xEF, 0xBF, 0xBD, 0xEF, 0xBF, 0xBD, 0xEF, 0xBF, 0xBD, 0xEF, 0xBF, 0xBD, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00};
|
||||
|
||||
bool HasCorrectHeader(byte[] bytes) => bytes.SequenceEqual(jpegHeader);
|
||||
bool HasBrokenHeader(byte[] bytes) => bytes.SequenceEqual(brokenJpegHeader);
|
||||
bool HasCorrectHeader(byte[]? bytes) => bytes?.SequenceEqual(jpegHeader) == true;
|
||||
bool HasBrokenHeader(byte[]? bytes) => bytes?.SequenceEqual(brokenJpegHeader) == true;
|
||||
|
||||
var serverForProxyForwarding = WireMockServer.Start();
|
||||
serverForProxyForwarding
|
||||
|
||||
Reference in New Issue
Block a user