diff --git a/src/LEGO.AsyncAPI/Models/AsyncApiBindings.cs b/src/LEGO.AsyncAPI/Models/AsyncApiBindings{TBinding}.cs similarity index 57% rename from src/LEGO.AsyncAPI/Models/AsyncApiBindings.cs rename to src/LEGO.AsyncAPI/Models/AsyncApiBindings{TBinding}.cs index 6aaa389a..f11858aa 100644 --- a/src/LEGO.AsyncAPI/Models/AsyncApiBindings.cs +++ b/src/LEGO.AsyncAPI/Models/AsyncApiBindings{TBinding}.cs @@ -7,33 +7,6 @@ namespace LEGO.AsyncAPI.Models using LEGO.AsyncAPI.Models.Interfaces; using LEGO.AsyncAPI.Writers; - public static class BindingExtensions - { - public static bool TryGetValue(this AsyncApiBindings bindings, out IServerBinding binding) - where TBinding : IServerBinding - { - return bindings.TryGetValue(Activator.CreateInstance().BindingKey, out binding); - } - - public static bool TryGetValue(this AsyncApiBindings bindings, out IChannelBinding binding) - where TBinding : IChannelBinding - { - return bindings.TryGetValue(Activator.CreateInstance().BindingKey, out binding); - } - - public static bool TryGetValue(this AsyncApiBindings bindings, out IOperationBinding binding) - where TBinding : IOperationBinding - { - return bindings.TryGetValue(Activator.CreateInstance().BindingKey, out binding); - } - - public static bool TryGetValue(this AsyncApiBindings bindings, out IMessageBinding binding) - where TBinding : IMessageBinding - { - return bindings.TryGetValue(Activator.CreateInstance().BindingKey, out binding); - } - } - public class AsyncApiBindings : Dictionary, IAsyncApiReferenceable where TBinding : IBinding { diff --git a/src/LEGO.AsyncAPI/Models/BindingExtensions.cs b/src/LEGO.AsyncAPI/Models/BindingExtensions.cs new file mode 100644 index 00000000..3bcab20f --- /dev/null +++ b/src/LEGO.AsyncAPI/Models/BindingExtensions.cs @@ -0,0 +1,62 @@ +// Copyright (c) The LEGO Group. All rights reserved. + +namespace LEGO.AsyncAPI.Models +{ + using System; + using LEGO.AsyncAPI.Models.Interfaces; + + public static class BindingExtensions + { + public static bool TryGetValue(this AsyncApiBindings bindings, out TBinding binding) + where TBinding : class, IServerBinding + { + if (bindings.TryGetValue(Activator.CreateInstance().BindingKey, out var serverBinding)) + { + binding = serverBinding as TBinding; + return true; + } + + binding = default; + return false; + } + + public static bool TryGetValue(this AsyncApiBindings bindings, out TBinding binding) + where TBinding : class, IChannelBinding + { + if (bindings.TryGetValue(Activator.CreateInstance().BindingKey, out var channelBinding)) + { + binding = channelBinding as TBinding; + return true; + } + + binding = default; + return false; + } + + public static bool TryGetValue(this AsyncApiBindings bindings, out TBinding binding) + where TBinding : class, IOperationBinding + { + if (bindings.TryGetValue(Activator.CreateInstance().BindingKey, out var operationBinding)) + { + binding = operationBinding as TBinding; + return true; + } + + binding = default; + return false; + } + + public static bool TryGetValue(this AsyncApiBindings bindings, out TBinding binding) + where TBinding : class, IMessageBinding + { + if (bindings.TryGetValue(Activator.CreateInstance().BindingKey, out var messageBinding)) + { + binding = messageBinding as TBinding; + return true; + } + + binding = default; + return false; + } + } +} diff --git a/test/LEGO.AsyncAPI.Tests/Bindings/BindingExtensions_Should.cs b/test/LEGO.AsyncAPI.Tests/Bindings/BindingExtensions_Should.cs new file mode 100644 index 00000000..3806fc03 --- /dev/null +++ b/test/LEGO.AsyncAPI.Tests/Bindings/BindingExtensions_Should.cs @@ -0,0 +1,89 @@ +// Copyright (c) The LEGO Group. All rights reserved. + +namespace LEGO.AsyncAPI.Tests.Bindings.WebSockets +{ + using System.Linq; + using FluentAssertions; + using LEGO.AsyncAPI.Bindings.MQTT; + using LEGO.AsyncAPI.Bindings.Pulsar; + using LEGO.AsyncAPI.Bindings.WebSockets; + using LEGO.AsyncAPI.Models; + using NUnit.Framework; + + public class BindingExtensions_Should + { + [Test] + public void TryGetValue_WithChannelBinding_ReturnsBinding() + { + var channel = new AsyncApiChannel(); + channel.Bindings.Add(new WebSocketsChannelBinding + { + Method = "POST", + Query = new AsyncApiSchema + { + Description = "this mah query", + }, + Headers = new AsyncApiSchema + { + Description = "this mah binding", + }, + }); + + var result = channel.Bindings.TryGetValue(out var channelBinding); + result.Should().BeTrue(); + channelBinding.Should().NotBeNull(); + channelBinding.Should().BeEquivalentTo(channel.Bindings.First().Value); + } + + [Test] + public void TryGetValue_WithServerBinding_ReturnsBinding() + { + var server = new AsyncApiServer(); + server.Bindings.Add(new PulsarServerBinding + { + Tenant = "test tenant", + }); + + var result = server.Bindings.TryGetValue(out var serverBinding); + result.Should().BeTrue(); + serverBinding.Should().NotBeNull(); + serverBinding.Should().BeEquivalentTo(server.Bindings.First().Value); + } + + [Test] + public void TryGetValue_WithOperationBinding_ReturnsBinding() + { + var operation = new AsyncApiOperation(); + operation.Bindings.Add(new MQTTOperationBinding + { + QoS = 23, + MessageExpiryInterval = 1, + Retain = true, + }); + + var result = operation.Bindings.TryGetValue(out var operationBinding); + result.Should().BeTrue(); + operationBinding.Should().NotBeNull(); + operationBinding.Should().BeEquivalentTo(operation.Bindings.First().Value); + } + + [Test] + public void TryGetValue_WithMessageBinding_ReturnsBinding() + { + var message = new AsyncApiMessage(); + message.Bindings.Add(new MQTTMessageBinding + { + PayloadFormatIndicator = 2, + CorrelationData = new AsyncApiSchema + { + Description = "Test", + }, + }); + + var result = message.Bindings.TryGetValue(out var messageBinding); + result.Should().BeTrue(); + messageBinding.Should().NotBeNull(); + messageBinding.Should().BeEquivalentTo(message.Bindings.First().Value); + } + } +} diff --git a/test/LEGO.AsyncAPI.Tests/Bindings/WebSockets/WebSocketBindings_Should.cs b/test/LEGO.AsyncAPI.Tests/Bindings/WebSockets/WebSocketBindings_Should.cs index b8aef976..c37ada58 100644 --- a/test/LEGO.AsyncAPI.Tests/Bindings/WebSockets/WebSocketBindings_Should.cs +++ b/test/LEGO.AsyncAPI.Tests/Bindings/WebSockets/WebSocketBindings_Should.cs @@ -8,8 +8,8 @@ namespace LEGO.AsyncAPI.Tests.Bindings.WebSockets using LEGO.AsyncAPI.Models; using LEGO.AsyncAPI.Readers; using NUnit.Framework; - - internal class WebSocketBindings_Should : TestBase + + public class WebSocketBindings_Should : TestBase { [Test] public void WebSocketChannelBinding_WithFilledObject_SerializesAndDeserializes()