From 3748a0ac4777720c59669300ee377d02066ff144 Mon Sep 17 00:00:00 2001 From: Luke Bakken Date: Wed, 2 Oct 2024 14:33:47 -0700 Subject: [PATCH] Allow exchange type to be a string Fixes #66 --- RabbitMQ.AMQP.Client/IEntities.cs | 3 ++- .../Impl/AmqpExchangeSpecification.cs | 16 +++++++++++----- .../Impl/RecordingTopologyListener.cs | 2 +- RabbitMQ.AMQP.Client/PublicAPI.Unshipped.txt | 8 +++++--- Tests/Management/ManagementTests.cs | 18 ++++++++++++++++++ 5 files changed, 37 insertions(+), 10 deletions(-) diff --git a/RabbitMQ.AMQP.Client/IEntities.cs b/RabbitMQ.AMQP.Client/IEntities.cs index 8b8969cf..42149db4 100644 --- a/RabbitMQ.AMQP.Client/IEntities.cs +++ b/RabbitMQ.AMQP.Client/IEntities.cs @@ -149,8 +149,9 @@ public interface IExchangeSpecification : IEntitySpecification bool IsAutoDelete { get; } IExchangeSpecification AutoDelete(bool isAutoDelete); - ExchangeType ExchangeType { get; } + string ExchangeType { get; } IExchangeSpecification Type(ExchangeType exchangeType); + IExchangeSpecification Type(string exchangeType); Dictionary ExchangeArguments { get; } IExchangeSpecification Argument(string key, object value); diff --git a/RabbitMQ.AMQP.Client/Impl/AmqpExchangeSpecification.cs b/RabbitMQ.AMQP.Client/Impl/AmqpExchangeSpecification.cs index 68f18301..9c6f7dbf 100644 --- a/RabbitMQ.AMQP.Client/Impl/AmqpExchangeSpecification.cs +++ b/RabbitMQ.AMQP.Client/Impl/AmqpExchangeSpecification.cs @@ -22,7 +22,7 @@ public AmqpExchangeSpecification(AmqpManagement management) private string _name = ""; private bool _autoDelete; - private ExchangeType _type = Client.ExchangeType.DIRECT; + private string _exchangeType = Client.ExchangeType.DIRECT.ToString(); private readonly Map _arguments = new(); public Task DeclareAsync() @@ -36,7 +36,7 @@ public Task DeclareAsync() { { "auto_delete", _autoDelete }, { "arguments", _arguments }, - { "type", _type.ToString().ToLower() }, + { "type", _exchangeType.ToLowerInvariant() }, { "durable", true } }; @@ -75,13 +75,19 @@ public IExchangeSpecification AutoDelete(bool autoDelete) public bool IsAutoDelete => _autoDelete; - public IExchangeSpecification Type(ExchangeType type) + public IExchangeSpecification Type(ExchangeType exchangeType) { - _type = type; + _exchangeType = exchangeType.ToString(); return this; } - public ExchangeType ExchangeType => _type; + public IExchangeSpecification Type(string exchangeType) + { + _exchangeType = exchangeType; + return this; + } + + public string ExchangeType => _exchangeType; public IExchangeSpecification Argument(string key, object value) { diff --git a/RabbitMQ.AMQP.Client/Impl/RecordingTopologyListener.cs b/RabbitMQ.AMQP.Client/Impl/RecordingTopologyListener.cs index 17eb6ca2..4bab7f3e 100644 --- a/RabbitMQ.AMQP.Client/Impl/RecordingTopologyListener.cs +++ b/RabbitMQ.AMQP.Client/Impl/RecordingTopologyListener.cs @@ -142,7 +142,7 @@ internal ExchangeSpec(IExchangeSpecification exchangeSpecification) internal string ExchangeName => _exchangeSpecification.ExchangeName; - internal ExchangeType ExchangeType => _exchangeSpecification.ExchangeType; + internal string ExchangeType => _exchangeSpecification.ExchangeType; internal bool IsAutoDelete => _exchangeSpecification.IsAutoDelete; diff --git a/RabbitMQ.AMQP.Client/PublicAPI.Unshipped.txt b/RabbitMQ.AMQP.Client/PublicAPI.Unshipped.txt index 7b1dc1a5..4fe42bf3 100644 --- a/RabbitMQ.AMQP.Client/PublicAPI.Unshipped.txt +++ b/RabbitMQ.AMQP.Client/PublicAPI.Unshipped.txt @@ -155,10 +155,11 @@ RabbitMQ.AMQP.Client.IExchangeSpecification.Arguments(System.Collections.Generic RabbitMQ.AMQP.Client.IExchangeSpecification.AutoDelete(bool isAutoDelete) -> RabbitMQ.AMQP.Client.IExchangeSpecification! RabbitMQ.AMQP.Client.IExchangeSpecification.ExchangeArguments.get -> System.Collections.Generic.Dictionary! RabbitMQ.AMQP.Client.IExchangeSpecification.ExchangeName.get -> string! -RabbitMQ.AMQP.Client.IExchangeSpecification.ExchangeType.get -> RabbitMQ.AMQP.Client.ExchangeType +RabbitMQ.AMQP.Client.IExchangeSpecification.ExchangeType.get -> string! RabbitMQ.AMQP.Client.IExchangeSpecification.IsAutoDelete.get -> bool RabbitMQ.AMQP.Client.IExchangeSpecification.Name(string! exchangeName) -> RabbitMQ.AMQP.Client.IExchangeSpecification! RabbitMQ.AMQP.Client.IExchangeSpecification.Type(RabbitMQ.AMQP.Client.ExchangeType exchangeType) -> RabbitMQ.AMQP.Client.IExchangeSpecification! +RabbitMQ.AMQP.Client.IExchangeSpecification.Type(string! exchangeType) -> RabbitMQ.AMQP.Client.IExchangeSpecification! RabbitMQ.AMQP.Client.ILifeCycle RabbitMQ.AMQP.Client.ILifeCycle.ChangeState -> RabbitMQ.AMQP.Client.LifeCycleCallBack! RabbitMQ.AMQP.Client.ILifeCycle.CloseAsync() -> System.Threading.Tasks.Task! @@ -262,10 +263,11 @@ RabbitMQ.AMQP.Client.Impl.AmqpExchangeSpecification.DeclareAsync() -> System.Thr RabbitMQ.AMQP.Client.Impl.AmqpExchangeSpecification.DeleteAsync() -> System.Threading.Tasks.Task! RabbitMQ.AMQP.Client.Impl.AmqpExchangeSpecification.ExchangeArguments.get -> System.Collections.Generic.Dictionary! RabbitMQ.AMQP.Client.Impl.AmqpExchangeSpecification.ExchangeName.get -> string! -RabbitMQ.AMQP.Client.Impl.AmqpExchangeSpecification.ExchangeType.get -> RabbitMQ.AMQP.Client.ExchangeType +RabbitMQ.AMQP.Client.Impl.AmqpExchangeSpecification.ExchangeType.get -> string! RabbitMQ.AMQP.Client.Impl.AmqpExchangeSpecification.IsAutoDelete.get -> bool RabbitMQ.AMQP.Client.Impl.AmqpExchangeSpecification.Name(string! name) -> RabbitMQ.AMQP.Client.IExchangeSpecification! -RabbitMQ.AMQP.Client.Impl.AmqpExchangeSpecification.Type(RabbitMQ.AMQP.Client.ExchangeType type) -> RabbitMQ.AMQP.Client.IExchangeSpecification! +RabbitMQ.AMQP.Client.Impl.AmqpExchangeSpecification.Type(RabbitMQ.AMQP.Client.ExchangeType exchangeType) -> RabbitMQ.AMQP.Client.IExchangeSpecification! +RabbitMQ.AMQP.Client.Impl.AmqpExchangeSpecification.Type(string! exchangeType) -> RabbitMQ.AMQP.Client.IExchangeSpecification! RabbitMQ.AMQP.Client.Impl.AmqpManagement RabbitMQ.AMQP.Client.Impl.AmqpManagement.Binding() -> RabbitMQ.AMQP.Client.IBindingSpecification! RabbitMQ.AMQP.Client.Impl.AmqpManagement.Exchange() -> RabbitMQ.AMQP.Client.IExchangeSpecification! diff --git a/Tests/Management/ManagementTests.cs b/Tests/Management/ManagementTests.cs index 05ab87f1..5d2f57eb 100644 --- a/Tests/Management/ManagementTests.cs +++ b/Tests/Management/ManagementTests.cs @@ -295,6 +295,24 @@ public async Task SimpleDeclareAndDeleteExchangeWithName() await SystemUtils.WaitUntilExchangeDeletedAsync(exchangeSpec); } + [Fact] + public async Task DeclareAndDeleteExchangeWithStringType() + { + Assert.NotNull(_connection); + Assert.NotNull(_management); + + IExchangeSpecification exchangeSpec = _management.Exchange(_exchangeName).Type("direct"); + await exchangeSpec.DeclareAsync(); + + await _management.Exchange(_exchangeName).Type("direct").DeclareAsync(); + + await SystemUtils.WaitUntilExchangeExistsAsync(exchangeSpec); + + await exchangeSpec.DeleteAsync(); + + await SystemUtils.WaitUntilExchangeDeletedAsync(exchangeSpec); + } + [Fact] public async Task ExchangeWithEmptyNameShouldRaiseAnException() {