mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-01-11 21:10:32 +01:00
Fix Testcontainers AddProtoDefinition (#1405)
* Fix Testcontainers AddProtoDefinition
* .
* UntilHttpRequestIsSucceeded
* WireMockContainer.ContainerPort
* System.Net/System.Net.Http
* ...
* WithWaitStrategy
* MaxHealthCheckRetries
* for
* _adminApi
* static
* ...
* testOutputHelper.WriteLine("Dumping WireMock logs:");
* Console.WriteLine(
* testOutputHelper.WriteLine("Dumping WireMock.Net mappings:");
* fix WithWaitStrategy
* [Fact]
* <PackageReference Include="ProtoBufJsonConverter" Version="0.11.0" />
* [Collection("Grpc")] / [Fact(Skip = "TODO")]
* ...
This commit is contained in:
161
test/WireMock.Net.Tests/Testcontainers/CombineUtilsTests.cs
Normal file
161
test/WireMock.Net.Tests/Testcontainers/CombineUtilsTests.cs
Normal file
@@ -0,0 +1,161 @@
|
||||
// Copyright © WireMock.Net
|
||||
|
||||
using System.Collections.Generic;
|
||||
using FluentAssertions;
|
||||
using WireMock.Net.Testcontainers.Utils;
|
||||
using Xunit;
|
||||
|
||||
namespace WireMock.Net.Tests.Testcontainers;
|
||||
|
||||
public class CombineUtilsTests
|
||||
{
|
||||
[Fact]
|
||||
public void Combine_Lists_WithBothEmpty_ReturnsEmptyList()
|
||||
{
|
||||
// Arrange
|
||||
var oldValue = new List<string>();
|
||||
var newValue = new List<string>();
|
||||
|
||||
// Act
|
||||
var result = CombineUtils.Combine(oldValue, newValue);
|
||||
|
||||
// Assert
|
||||
result.Should().BeEmpty();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Combine_Lists_WithEmptyOldValue_ReturnsNewValue()
|
||||
{
|
||||
// Arrange
|
||||
var oldValue = new List<string>();
|
||||
var newValue = new List<string> { "item1", "item2" };
|
||||
|
||||
// Act
|
||||
var result = CombineUtils.Combine(oldValue, newValue);
|
||||
|
||||
// Assert
|
||||
result.Should().Equal("item1", "item2");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Combine_Lists_WithEmptyNewValue_ReturnsOldValue()
|
||||
{
|
||||
// Arrange
|
||||
var oldValue = new List<string> { "item1", "item2" };
|
||||
var newValue = new List<string>();
|
||||
|
||||
// Act
|
||||
var result = CombineUtils.Combine(oldValue, newValue);
|
||||
|
||||
// Assert
|
||||
result.Should().Equal("item1", "item2");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Combine_Lists_WithBothPopulated_ReturnsConcatenatedList()
|
||||
{
|
||||
// Arrange
|
||||
var oldValue = new List<int> { 1, 2, 3 };
|
||||
var newValue = new List<int> { 4, 5, 6 };
|
||||
|
||||
// Act
|
||||
var result = CombineUtils.Combine(oldValue, newValue);
|
||||
|
||||
// Assert
|
||||
result.Should().Equal(1, 2, 3, 4, 5, 6);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Combine_Lists_WithDuplicates_RemovesDuplicates()
|
||||
{
|
||||
// Arrange
|
||||
var oldValue = new List<string> { "a", "b", "c" };
|
||||
var newValue = new List<string> { "b", "c", "d" };
|
||||
|
||||
// Act
|
||||
var result = CombineUtils.Combine(oldValue, newValue);
|
||||
|
||||
// Assert
|
||||
result.Should().Equal("a", "b", "c", "d");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Combine_Dictionaries_WithBothEmpty_ReturnsEmptyDictionary()
|
||||
{
|
||||
// Arrange
|
||||
var oldValue = new Dictionary<string, int>();
|
||||
var newValue = new Dictionary<string, int>();
|
||||
|
||||
// Act
|
||||
var result = CombineUtils.Combine(oldValue, newValue);
|
||||
|
||||
// Assert
|
||||
result.Should().BeEmpty();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Combine_Dictionaries_WithEmptyOldValue_ReturnsNewValue()
|
||||
{
|
||||
// Arrange
|
||||
var oldValue = new Dictionary<string, int>();
|
||||
var newValue = new Dictionary<string, int>
|
||||
{
|
||||
{ "key1", 1 },
|
||||
{ "key2", 2 }
|
||||
};
|
||||
|
||||
// Act
|
||||
var result = CombineUtils.Combine(oldValue, newValue);
|
||||
|
||||
// Assert
|
||||
result.Should().HaveCount(2);
|
||||
result["key1"].Should().Be(1);
|
||||
result["key2"].Should().Be(2);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Combine_Dictionaries_WithEmptyNewValue_ReturnsOldValue()
|
||||
{
|
||||
// Arrange
|
||||
var oldValue = new Dictionary<string, int>
|
||||
{
|
||||
{ "key1", 1 },
|
||||
{ "key2", 2 }
|
||||
};
|
||||
var newValue = new Dictionary<string, int>();
|
||||
|
||||
// Act
|
||||
var result = CombineUtils.Combine(oldValue, newValue);
|
||||
|
||||
// Assert
|
||||
result.Should().HaveCount(2);
|
||||
result["key1"].Should().Be(1);
|
||||
result["key2"].Should().Be(2);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Combine_Dictionaries_WithNoOverlappingKeys_ReturnsMergedDictionary()
|
||||
{
|
||||
// Arrange
|
||||
var oldValue = new Dictionary<string, string>
|
||||
{
|
||||
{ "key1", "value1" },
|
||||
{ "key2", "value2" }
|
||||
};
|
||||
var newValue = new Dictionary<string, string>
|
||||
{
|
||||
{ "key3", "value3" },
|
||||
{ "key4", "value4" }
|
||||
};
|
||||
|
||||
// Act
|
||||
var result = CombineUtils.Combine(oldValue, newValue);
|
||||
|
||||
// Assert
|
||||
result.Should().HaveCount(4);
|
||||
result["key1"].Should().Be("value1");
|
||||
result["key2"].Should().Be("value2");
|
||||
result["key3"].Should().Be("value3");
|
||||
result["key4"].Should().Be("value4");
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,7 @@ namespace WireMock.Net.Tests.Testcontainers;
|
||||
[Collection("Grpc")]
|
||||
public class TestcontainersTestsGrpc(ITestOutputHelper testOutputHelper)
|
||||
{
|
||||
[Fact]
|
||||
[Fact(Skip = "TODO")]
|
||||
public async Task WireMockContainer_Build_Grpc_TestPortsAndUrls1()
|
||||
{
|
||||
// Arrange
|
||||
@@ -37,7 +37,7 @@ public class TestcontainersTestsGrpc(ITestOutputHelper testOutputHelper)
|
||||
.WithCommand("--Urls", $"http://*:80 grpc://*:{port}")
|
||||
.WithPortBinding(port, true)
|
||||
.Build();
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
await wireMockContainer.StartAsync();
|
||||
@@ -78,7 +78,7 @@ public class TestcontainersTestsGrpc(ITestOutputHelper testOutputHelper)
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[Fact(Skip = "TODO")]
|
||||
public async Task WireMockContainer_Build_Grpc_TestPortsAndUrls2()
|
||||
{
|
||||
// Arrange
|
||||
@@ -131,7 +131,7 @@ public class TestcontainersTestsGrpc(ITestOutputHelper testOutputHelper)
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[Fact(Skip = "TODO")]
|
||||
public async Task WireMockContainer_Build_Grpc_ProtoDefinitionFromJson_UsingGrpcGeneratedClient()
|
||||
{
|
||||
var wireMockContainer = await Given_WireMockContainerIsStartedForHttpAndGrpcAsync();
|
||||
@@ -145,7 +145,7 @@ public class TestcontainersTestsGrpc(ITestOutputHelper testOutputHelper)
|
||||
await StopAsync(wireMockContainer);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[Fact(Skip = "TODO")]
|
||||
public async Task WireMockContainer_Build_Grpc_ProtoDefinitionAtServerLevel_UsingGrpcGeneratedClient()
|
||||
{
|
||||
var wireMockContainer = await Given_WireMockContainerWithProtoDefinitionAtServerLevelIsStartedForHttpAndGrpcAsync();
|
||||
@@ -159,7 +159,7 @@ public class TestcontainersTestsGrpc(ITestOutputHelper testOutputHelper)
|
||||
await StopAsync(wireMockContainer);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[Fact(Skip = "TODO")]
|
||||
public async Task WireMockContainer_Build_Grpc_ProtoDefinitionAtServerLevel_UsingGrpcGeneratedClient_AndWithWatchStaticMappings()
|
||||
{
|
||||
var wireMockContainer = await Given_WireMockContainerWithProtoDefinitionAtServerLevelWithWatchStaticMappingsIsStartedForHttpAndGrpcAsync();
|
||||
@@ -171,6 +171,35 @@ public class TestcontainersTestsGrpc(ITestOutputHelper testOutputHelper)
|
||||
await StopAsync(wireMockContainer);
|
||||
}
|
||||
|
||||
private async Task<HelloReply> When_GrpcClient_Calls_SayHelloAsync(WireMockContainer wireMockContainer)
|
||||
{
|
||||
var address = wireMockContainer.GetPublicUrls().First(x => x.Key != 80).Value;
|
||||
var channel = GrpcChannel.ForAddress(address);
|
||||
|
||||
var client = new Greeter.GreeterClient(channel);
|
||||
|
||||
try
|
||||
{
|
||||
return await client.SayHelloAsync(new HelloRequest { Name = "stef" });
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
testOutputHelper.WriteLine("Exception during GrpcClient Call to {0}. Exception = {1}.", address, ex);
|
||||
|
||||
testOutputHelper.WriteLine("Dumping WireMock.Net logs:");
|
||||
var (stdOut, stdError) = await wireMockContainer.GetLogsAsync(DateTime.MinValue);
|
||||
testOutputHelper.WriteLine("Out :\r\n{0}", stdOut);
|
||||
testOutputHelper.WriteLine("Error:\r\n{0}", stdError);
|
||||
|
||||
testOutputHelper.WriteLine("Dumping WireMock.Net mappings:");
|
||||
using var httpClient = wireMockContainer.CreateClient();
|
||||
using var response = await httpClient.GetAsync("/__admin/mappings");
|
||||
var mappings = await response.Content.ReadAsStringAsync();
|
||||
testOutputHelper.WriteLine("Mappings:\r\n{0}", mappings);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task StopAsync(WireMockContainer wireMockContainer)
|
||||
{
|
||||
try
|
||||
@@ -240,18 +269,6 @@ public class TestcontainersTestsGrpc(ITestOutputHelper testOutputHelper)
|
||||
|
||||
var result = await httpClient.PostAsync("/__admin/mappings", new StringContent(mappingsJson, Encoding.UTF8, WireMockConstants.ContentTypeJson));
|
||||
result.EnsureSuccessStatusCode();
|
||||
|
||||
await Task.Delay(5000);
|
||||
}
|
||||
|
||||
private static async Task<HelloReply> When_GrpcClient_Calls_SayHelloAsync(WireMockContainer wireMockContainer)
|
||||
{
|
||||
var address = wireMockContainer.GetPublicUrls().First(x => x.Key != 80).Value;
|
||||
var channel = GrpcChannel.ForAddress(address);
|
||||
|
||||
var client = new Greeter.GreeterClient(channel);
|
||||
|
||||
return await client.SayHelloAsync(new HelloRequest { Name = "stef" });
|
||||
}
|
||||
|
||||
private static void Then_ReplyMessage_Should_BeCorrect(HelloReply reply)
|
||||
|
||||
@@ -38,6 +38,10 @@
|
||||
<Compile Remove="Util\JsonUtilsTests.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Include="..\..\src\WireMock.Net.Testcontainers\Utils\CombineUtils.cs" Link="Testcontainers\CombineUtils.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<!-- https://stackoverflow.com/questions/59406201/filenesting-not-working-for-class-or-shared-library-projects -->
|
||||
<ProjectCapability Include="ConfigurableFileNesting" />
|
||||
|
||||
Reference in New Issue
Block a user