diff --git a/src/Testcontainers.ServiceBus/ServiceBusBuilder.cs b/src/Testcontainers.ServiceBus/ServiceBusBuilder.cs index 12d4d0b84..278a85cf7 100644 --- a/src/Testcontainers.ServiceBus/ServiceBusBuilder.cs +++ b/src/Testcontainers.ServiceBus/ServiceBusBuilder.cs @@ -54,11 +54,55 @@ public ServiceBusBuilder WithAcceptLicenseAgreement(bool acceptLicenseAgreement) return WithEnvironment(AcceptLicenseAgreementEnvVar, licenseAgreement); } + /// + /// Sets the dependent MSSQL container for the Azure Service Bus Emulator. + /// + /// + /// This method allows an existing MSSQL container to be attached to the Azure Service + /// Bus Emulator. The containers must be on the same network to enable communication + /// between them. + /// + /// The network to connect the container to. + /// The MSSQL container. + /// The MSSQL container network alias. + /// The MSSQL container password. + /// A configured instance of . + public ServiceBusBuilder WithMsSqlContainer( + INetwork network, + MsSqlContainer container, + string networkAlias, + string password = MsSqlBuilder.DefaultPassword) + { + return Merge(DockerResourceConfiguration, new ServiceBusConfiguration(databaseContainer: container)) + .DependsOn(container) + .WithNetwork(network) + .WithNetworkAliases(ServiceBusNetworkAlias) + .WithEnvironment("SQL_SERVER", networkAlias) + .WithEnvironment("MSSQL_SA_PASSWORD", password); + } + /// public override ServiceBusContainer Build() { Validate(); - return new ServiceBusContainer(DockerResourceConfiguration); + + if (DockerResourceConfiguration.DatabaseContainer != null) + { + return new ServiceBusContainer(DockerResourceConfiguration); + } + + // If the user has not provided an existing MSSQL container instance, + // we configure one. + var network = new NetworkBuilder() + .Build(); + + var container = new MsSqlBuilder() + .WithNetwork(network) + .WithNetworkAliases(DatabaseNetworkAlias) + .Build(); + + var serviceBusContainer = WithMsSqlContainer(network, container, DatabaseNetworkAlias); + return new ServiceBusContainer(serviceBusContainer.DockerResourceConfiguration); } /// @@ -80,10 +124,7 @@ protected override ServiceBusBuilder Init() { return base.Init() .WithImage(ServiceBusImage) - .WithNetwork(new NetworkBuilder().Build()) - .WithNetworkAliases(ServiceBusNetworkAlias) .WithPortBinding(ServiceBusPort, true) - .WithMsSqlContainer() .WithWaitStrategy(Wait.ForUnixContainer() .UntilMessageIsLogged("Emulator Service is Successfully Up!") .AddCustomWaitStrategy(new WaitTwoSeconds())); @@ -107,25 +148,9 @@ protected override ServiceBusBuilder Merge(ServiceBusConfiguration oldValue, Ser return new ServiceBusBuilder(new ServiceBusConfiguration(oldValue, newValue)); } - /// - /// Configures the dependent MSSQL container. - /// - /// A configured instance of . - private ServiceBusBuilder WithMsSqlContainer() - { - var msSqlContainer = new MsSqlBuilder() - .WithNetwork(DockerResourceConfiguration.Networks.Single()) - .WithNetworkAliases(DatabaseNetworkAlias) - .Build(); - - return Merge(DockerResourceConfiguration, new ServiceBusConfiguration(databaseContainer: msSqlContainer)) - .WithEnvironment("MSSQL_SA_PASSWORD", MsSqlBuilder.DefaultPassword) - .WithEnvironment("SQL_SERVER", DatabaseNetworkAlias); - } - /// /// - /// This is a workaround to ensure that the wait strategy does not indicate + /// This is a workaround to ensure that the wait strategy does not indicate /// readiness too early: /// https://github.com/Azure/azure-service-bus-emulator-installer/issues/35#issuecomment-2497164533. /// diff --git a/src/Testcontainers.ServiceBus/Usings.cs b/src/Testcontainers.ServiceBus/Usings.cs index 6f294326f..ea7628ae0 100644 --- a/src/Testcontainers.ServiceBus/Usings.cs +++ b/src/Testcontainers.ServiceBus/Usings.cs @@ -1,7 +1,6 @@ global using System; global using System.Collections.Generic; global using System.Linq; -global using System.Text.RegularExpressions; global using System.Threading; global using System.Threading.Tasks; global using Docker.DotNet.Models; @@ -9,6 +8,6 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using DotNet.Testcontainers.Images; +global using DotNet.Testcontainers.Networks; global using JetBrains.Annotations; global using Testcontainers.MsSql; \ No newline at end of file diff --git a/src/Testcontainers/Builders/IContainerBuilder`2.cs b/src/Testcontainers/Builders/IContainerBuilder`2.cs index 1475881f8..26477db49 100644 --- a/src/Testcontainers/Builders/IContainerBuilder`2.cs +++ b/src/Testcontainers/Builders/IContainerBuilder`2.cs @@ -378,7 +378,7 @@ public interface IContainerBuilder : I /// /// Assigns the specified network to the container. /// - /// The network to connect container to. + /// The network to connect the container to. /// A configured instance of . [PublicAPI] TBuilderEntity WithNetwork(INetwork network); diff --git a/tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs b/tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs index d35a88117..29fa40eba 100644 --- a/tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs +++ b/tests/Testcontainers.ServiceBus.Tests/ServiceBusContainerTest.cs @@ -1,8 +1,13 @@ namespace Testcontainers.ServiceBus; -public sealed class ServiceBusContainerTest : IAsyncLifetime +public abstract class ServiceBusContainerTest : IAsyncLifetime { - private readonly ServiceBusContainer _serviceBusContainer = new ServiceBusBuilder().WithAcceptLicenseAgreement(true).Build(); + private readonly ServiceBusContainer _serviceBusContainer; + + private ServiceBusContainerTest(ServiceBusContainer serviceBusContainer) + { + _serviceBusContainer = serviceBusContainer; + } public Task InitializeAsync() { @@ -47,4 +52,43 @@ await sender.SendMessageAsync(message) // Then Assert.Equal(helloServiceBus, receivedMessage.Body.ToString()); } + + [UsedImplicitly] + public sealed class ServiceBusDefaultMsSqlConfiguration : ServiceBusContainerTest + { + public ServiceBusDefaultMsSqlConfiguration() + : base(new ServiceBusBuilder().WithAcceptLicenseAgreement(true).Build()) + { + } + } + + [UsedImplicitly] + public sealed class ServiceBusCustomMsSqlConfiguration : ServiceBusContainerTest, IClassFixture + { + public ServiceBusCustomMsSqlConfiguration(DatabaseFixture fixture) + : base(new ServiceBusBuilder().WithAcceptLicenseAgreement(true).WithMsSqlContainer(fixture.Network, fixture.Container, fixture.DatabaseNetworkAlias).Build()) + { + } + } + + [UsedImplicitly] + public sealed class DatabaseFixture + { + public DatabaseFixture() + { + Network = new NetworkBuilder() + .Build(); + + Container = new MsSqlBuilder() + .WithNetwork(Network) + .WithNetworkAliases(DatabaseNetworkAlias) + .Build(); + } + + public string DatabaseNetworkAlias => ServiceBusBuilder.DatabaseNetworkAlias; + + public INetwork Network { get; } + + public MsSqlContainer Container { get; } + } } \ No newline at end of file diff --git a/tests/Testcontainers.ServiceBus.Tests/Usings.cs b/tests/Testcontainers.ServiceBus.Tests/Usings.cs index 9ddd0ad38..1e0024b2c 100644 --- a/tests/Testcontainers.ServiceBus.Tests/Usings.cs +++ b/tests/Testcontainers.ServiceBus.Tests/Usings.cs @@ -1,5 +1,8 @@ -global using System; global using System.Threading.Tasks; global using Azure.Messaging.ServiceBus; +global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Commons; +global using DotNet.Testcontainers.Networks; +global using JetBrains.Annotations; +global using Testcontainers.MsSql; global using Xunit; \ No newline at end of file