// Copyright © WireMock.Net #if PROTOBUF using System; using System.Threading.Tasks; using FluentAssertions; using ProtoBuf; using WireMock.Matchers; using WireMock.Models; using Xunit; namespace WireMock.Net.Tests.Matchers; public class ProtoBufMatcherTests { private const string MessageType = "greet.HelloRequest"; private readonly IdOrText _protoDefinition = new(null, @" syntax = ""proto3""; package greet; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply); } message HelloRequest { string name = 1; } message HelloReply { string message = 1; } "); [Fact] public async Task ProtoBufMatcher_For_ValidProtoBuf_And_ValidMethod_DecodeAsync() { // Arrange var bytes = Convert.FromBase64String("CgRzdGVm"); // Act var matcher = new ProtoBufMatcher(() => _protoDefinition, MessageType); var result = await matcher.DecodeAsync(bytes).ConfigureAwait(false); // Assert result.Should().BeEquivalentTo(new { name = "stef" }); } [Fact] public async Task ProtoBufMatcher_For_ValidProtoBuf_And_ValidMethod_NoJsonMatchers_IsMatchAsync() { // Arrange var bytes = Convert.FromBase64String("CgRzdGVm"); // Act var matcher = new ProtoBufMatcher(() => _protoDefinition, MessageType); var result = await matcher.IsMatchAsync(bytes).ConfigureAwait(false); // Assert result.Score.Should().Be(MatchScores.Perfect); result.Exception.Should().BeNull(); } [Fact] public async Task ProtoBufMatcher_For_ValidProtoBuf_And_ValidMethod_Using_JsonMatcher_IsMatchAsync() { // Arrange var jsonMatcher = new JsonMatcher(new { name = "stef" }); var bytes = Convert.FromBase64String("CgRzdGVm"); // Act var matcher = new ProtoBufMatcher(() => _protoDefinition, MessageType, matcher: jsonMatcher); var result = await matcher.IsMatchAsync(bytes); // Assert result.Score.Should().Be(MatchScores.Perfect); result.Exception.Should().BeNull(); } [Fact] public async Task ProtoBufMatcher_For_InvalidProtoBuf_IsNoMatch() { // Arrange var bytes = new byte[] { 1, 2, 3 }; // Act var matcher = new ProtoBufMatcher(() => _protoDefinition, MessageType); var result = await matcher.IsMatchAsync(bytes); // Assert result.Score.Should().Be(MatchScores.Mismatch); result.Exception.Should().BeOfType(); } [Fact] public async Task ProtoBufMatcher_For_InvalidMethod_IsNoMatchAsync() { // Arrange var bytes = Convert.FromBase64String("CgRzdGVm"); // Act var matcher = new ProtoBufMatcher(() => _protoDefinition, "greet.Greeter.X"); var result = await matcher.IsMatchAsync(bytes); // Assert result.Score.Should().Be(MatchScores.Mismatch); result.Exception.Should().BeOfType(); } } #endif