From 977d348aa6474e26a741b7820648df20ffef81ec Mon Sep 17 00:00:00 2001 From: Chase Wallis Date: Wed, 16 Apr 2025 13:44:17 -0600 Subject: [PATCH 1/2] feat: Custom configuration option for Azure Service Bus --- docs/modules/servicebus.md | 12 +++++++- .../ServiceBusBuilder.cs | 13 +++++++++ .../ServiceBusContainerTest.cs | 23 +++++++++++++-- .../Testcontainers.ServiceBus.Tests.csproj | 6 ++++ .../customConfig.json | 28 +++++++++++++++++++ 5 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 tests/Testcontainers.ServiceBus.Tests/customConfig.json diff --git a/docs/modules/servicebus.md b/docs/modules/servicebus.md index 8ca30525d..4030be728 100644 --- a/docs/modules/servicebus.md +++ b/docs/modules/servicebus.md @@ -40,4 +40,14 @@ The Service Bus module depends on an MSSQL container instance. The module automa === "Reuse Existing Resources" ```csharp --8<-- "tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs:ReuseExistingMsSqlContainer" - ``` \ No newline at end of file + ``` + +## Use a custom Config.json + +The Azure Service Bus Emulator provides a default configuration. If a custom configuration is desired, you can use the following method to provide the custom json file to the builder accordingly: + +=== "Use Custom Configuration" +```csharp +--8<-- "tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs:UseCustomConfiguration" +``` +See Azure Service Bus emulator documentation for information on creating that json file. diff --git a/src/Testcontainers.ServiceBus/ServiceBusBuilder.cs b/src/Testcontainers.ServiceBus/ServiceBusBuilder.cs index 1069802d3..64ab8c8e5 100644 --- a/src/Testcontainers.ServiceBus/ServiceBusBuilder.cs +++ b/src/Testcontainers.ServiceBus/ServiceBusBuilder.cs @@ -1,3 +1,5 @@ +using System.IO; + namespace Testcontainers.ServiceBus; /// @@ -85,6 +87,17 @@ public ServiceBusBuilder WithMsSqlContainer( .WithEnvironment("SQL_SERVER", networkAlias) .WithEnvironment("MSSQL_SA_PASSWORD", password); } + + /// + /// Sets the configuration file for the Azure Service Bus Emulator. + /// + /// The JSON file containing desired Azure Service Bus configuration + /// A configured instance of . + public ServiceBusBuilder WithConfig(string customConfigFile) + { + return WithResourceMapping(new FileInfo(customConfigFile), + new FileInfo("/ServiceBus_Emulator/ConfigFiles/Config.json")); + } /// public override ServiceBusContainer Build() diff --git a/tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs b/tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs index ea9c9e046..613923f4f 100644 --- a/tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs +++ b/tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs @@ -20,6 +20,8 @@ public Task DisposeAsync() return _serviceBusContainer.DisposeAsync().AsTask(); } + protected virtual string QueueName => "queue.1"; + [Fact] [Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))] public async Task ReceiveMessageReturnsSentMessage() @@ -33,15 +35,14 @@ public async Task ReceiveMessageReturnsSentMessage() // Upload a custom configuration before the container starts using the // `WithResourceMapping(string, string)` API or one of its overloads: // `WithResourceMapping("Config.json", "/ServiceBus_Emulator/ConfigFiles/")`. - const string queueName = "queue.1"; var message = new ServiceBusMessage(helloServiceBus); await using var client = new ServiceBusClient(_serviceBusContainer.GetConnectionString()); - var sender = client.CreateSender(queueName); + var sender = client.CreateSender(QueueName); - var receiver = client.CreateReceiver(queueName); + var receiver = client.CreateReceiver(QueueName); // When await sender.SendMessageAsync(message) @@ -81,6 +82,22 @@ public ServiceBusCustomMsSqlConfiguration(DatabaseFixture fixture) { } } + + [UsedImplicitly] + public sealed class ServiceBusCustomConfig : ServiceBusContainerTest, IClassFixture + { + protected override string QueueName => "custom-queue.1"; + + public ServiceBusCustomConfig() + : base(new ServiceBusBuilder() + .WithAcceptLicenseAgreement(true) + // # --8<-- [start:UseCustomConfiguration] + .WithConfig("customConfig.json") + // # --8<-- [end:UseCustomConfiguration] + .Build()) + { + } + } [UsedImplicitly] public sealed class DatabaseFixture diff --git a/tests/Testcontainers.ServiceBus.Tests/Testcontainers.ServiceBus.Tests.csproj b/tests/Testcontainers.ServiceBus.Tests/Testcontainers.ServiceBus.Tests.csproj index 6c81fbd03..341e6673a 100644 --- a/tests/Testcontainers.ServiceBus.Tests/Testcontainers.ServiceBus.Tests.csproj +++ b/tests/Testcontainers.ServiceBus.Tests/Testcontainers.ServiceBus.Tests.csproj @@ -17,4 +17,10 @@ + + + + PreserveNewest + + \ No newline at end of file diff --git a/tests/Testcontainers.ServiceBus.Tests/customConfig.json b/tests/Testcontainers.ServiceBus.Tests/customConfig.json new file mode 100644 index 000000000..769efc1e9 --- /dev/null +++ b/tests/Testcontainers.ServiceBus.Tests/customConfig.json @@ -0,0 +1,28 @@ +{ + "UserConfig": { + "Namespaces": [ + { + "Name": "sbemulatorns", + "Queues": [ + { + "Name": "custom-queue.1", + "Properties": { + "DeadLetteringOnMessageExpiration": false, + "DefaultMessageTimeToLive": "PT1H", + "DuplicateDetectionHistoryTimeWindow": "PT20S", + "ForwardDeadLetteredMessagesTo": "", + "ForwardTo": "", + "LockDuration": "PT1M", + "MaxDeliveryCount": 3, + "RequiresDuplicateDetection": false, + "RequiresSession": false + } + } + ] + } + ], + "Logging": { + "Type": "File" + } + } +} \ No newline at end of file From fe62d0513d66c4e44acfe47cc0cc1ae296dde092 Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Thu, 17 Apr 2025 13:15:45 +0200 Subject: [PATCH 2/2] chore: Apply repo standards --- docs/modules/servicebus.md | 9 ++++----- .../ServiceBusBuilder.cs | 16 ++++++++-------- src/Testcontainers.ServiceBus/Usings.cs | 1 + .../ServiceBusContainerTest.cs | 16 ++++++++-------- .../Testcontainers.ServiceBus.Tests.csproj | 7 +++---- ...ustomConfig.json => custom-queue-config.json} | 0 6 files changed, 24 insertions(+), 25 deletions(-) rename tests/Testcontainers.ServiceBus.Tests/{customConfig.json => custom-queue-config.json} (100%) diff --git a/docs/modules/servicebus.md b/docs/modules/servicebus.md index 4030be728..2d284f436 100644 --- a/docs/modules/servicebus.md +++ b/docs/modules/servicebus.md @@ -44,10 +44,9 @@ The Service Bus module depends on an MSSQL container instance. The module automa ## Use a custom Config.json -The Azure Service Bus Emulator provides a default configuration. If a custom configuration is desired, you can use the following method to provide the custom json file to the builder accordingly: +The Azure Service Bus Emulator provides a [default](https://learn.microsoft.com/en-us/azure/service-bus-messaging/test-locally-with-service-bus-emulator?tabs=automated-script#interact-with-the-emulator) configuration. If a custom configuration is desired, you can use the following method to provide a custom JSON file to the builder accordingly: === "Use Custom Configuration" -```csharp ---8<-- "tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs:UseCustomConfiguration" -``` -See Azure Service Bus emulator documentation for information on creating that json file. + ```csharp + --8<-- "tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs:UseCustomConfiguration" + ``` \ No newline at end of file diff --git a/src/Testcontainers.ServiceBus/ServiceBusBuilder.cs b/src/Testcontainers.ServiceBus/ServiceBusBuilder.cs index 64ab8c8e5..0938396dc 100644 --- a/src/Testcontainers.ServiceBus/ServiceBusBuilder.cs +++ b/src/Testcontainers.ServiceBus/ServiceBusBuilder.cs @@ -1,5 +1,3 @@ -using System.IO; - namespace Testcontainers.ServiceBus; /// @@ -87,16 +85,18 @@ public ServiceBusBuilder WithMsSqlContainer( .WithEnvironment("SQL_SERVER", networkAlias) .WithEnvironment("MSSQL_SA_PASSWORD", password); } - + /// - /// Sets the configuration file for the Azure Service Bus Emulator. + /// Sets the configuration for the Azure Service Bus Emulator. /// - /// The JSON file containing desired Azure Service Bus configuration + /// + /// Default emulator configuration: https://learn.microsoft.com/en-us/azure/service-bus-messaging/test-locally-with-service-bus-emulator?tabs=automated-script#interact-with-the-emulator. + /// + /// The path to the JSON file containing the Azure Service Bus Emulator configuration. /// A configured instance of . - public ServiceBusBuilder WithConfig(string customConfigFile) + public ServiceBusBuilder WithConfig(string configFilePath) { - return WithResourceMapping(new FileInfo(customConfigFile), - new FileInfo("/ServiceBus_Emulator/ConfigFiles/Config.json")); + return WithResourceMapping(new FileInfo(configFilePath), new FileInfo("/ServiceBus_Emulator/ConfigFiles/Config.json")); } /// diff --git a/src/Testcontainers.ServiceBus/Usings.cs b/src/Testcontainers.ServiceBus/Usings.cs index 15c8b2eda..374157c98 100644 --- a/src/Testcontainers.ServiceBus/Usings.cs +++ b/src/Testcontainers.ServiceBus/Usings.cs @@ -1,5 +1,6 @@ global using System; global using System.Collections.Generic; +global using System.IO; global using System.Linq; global using System.Threading; global using System.Threading.Tasks; diff --git a/tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs b/tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs index 613923f4f..c9549036d 100644 --- a/tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs +++ b/tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs @@ -9,6 +9,8 @@ private ServiceBusContainerTest(ServiceBusContainer serviceBusContainer) _serviceBusContainer = serviceBusContainer; } + protected virtual string QueueName => "queue.1"; + // # --8<-- [start:UseServiceBusContainer] public Task InitializeAsync() { @@ -20,8 +22,6 @@ public Task DisposeAsync() return _serviceBusContainer.DisposeAsync().AsTask(); } - protected virtual string QueueName => "queue.1"; - [Fact] [Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))] public async Task ReceiveMessageReturnsSentMessage() @@ -82,21 +82,21 @@ public ServiceBusCustomMsSqlConfiguration(DatabaseFixture fixture) { } } - + [UsedImplicitly] - public sealed class ServiceBusCustomConfig : ServiceBusContainerTest, IClassFixture + public sealed class ServiceBusCustomQueueConfiguration : ServiceBusContainerTest, IClassFixture { - protected override string QueueName => "custom-queue.1"; - - public ServiceBusCustomConfig() + public ServiceBusCustomQueueConfiguration() : base(new ServiceBusBuilder() .WithAcceptLicenseAgreement(true) // # --8<-- [start:UseCustomConfiguration] - .WithConfig("customConfig.json") + .WithConfig("custom-queue-config.json") // # --8<-- [end:UseCustomConfiguration] .Build()) { } + + protected override string QueueName => "custom-queue.1"; } [UsedImplicitly] diff --git a/tests/Testcontainers.ServiceBus.Tests/Testcontainers.ServiceBus.Tests.csproj b/tests/Testcontainers.ServiceBus.Tests/Testcontainers.ServiceBus.Tests.csproj index 341e6673a..88111d5ae 100644 --- a/tests/Testcontainers.ServiceBus.Tests/Testcontainers.ServiceBus.Tests.csproj +++ b/tests/Testcontainers.ServiceBus.Tests/Testcontainers.ServiceBus.Tests.csproj @@ -18,9 +18,8 @@ - - - PreserveNewest - + + PreserveNewest + \ No newline at end of file diff --git a/tests/Testcontainers.ServiceBus.Tests/customConfig.json b/tests/Testcontainers.ServiceBus.Tests/custom-queue-config.json similarity index 100% rename from tests/Testcontainers.ServiceBus.Tests/customConfig.json rename to tests/Testcontainers.ServiceBus.Tests/custom-queue-config.json