From 3e2b81d13d89c5851bdd8cb6a6cb355bd88722e1 Mon Sep 17 00:00:00 2001 From: Joel Mut Date: Tue, 28 Jan 2025 15:32:38 +0000 Subject: [PATCH 1/2] Add unit tests to Agents.Client to increase code coverage --- .../Microsoft.Agents.Client/AssemblyInfo.cs | 6 + .../ConfigurationChannelHostTests.cs | 340 ++++++++++++++++++ .../HttpBotChannelFactoryTests.cs | 44 +++ .../HttpBotChannelTests.cs | 130 +++++++ 4 files changed, 520 insertions(+) create mode 100644 src/libraries/Client/Microsoft.Agents.Client/AssemblyInfo.cs create mode 100644 src/tests/Microsoft.Agents.Client.Tests/ConfigurationChannelHostTests.cs create mode 100644 src/tests/Microsoft.Agents.Client.Tests/HttpBotChannelFactoryTests.cs create mode 100644 src/tests/Microsoft.Agents.Client.Tests/HttpBotChannelTests.cs diff --git a/src/libraries/Client/Microsoft.Agents.Client/AssemblyInfo.cs b/src/libraries/Client/Microsoft.Agents.Client/AssemblyInfo.cs new file mode 100644 index 00000000..a36de119 --- /dev/null +++ b/src/libraries/Client/Microsoft.Agents.Client/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("Microsoft.Agents.Client.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9")] diff --git a/src/tests/Microsoft.Agents.Client.Tests/ConfigurationChannelHostTests.cs b/src/tests/Microsoft.Agents.Client.Tests/ConfigurationChannelHostTests.cs new file mode 100644 index 00000000..9c6df7e4 --- /dev/null +++ b/src/tests/Microsoft.Agents.Client.Tests/ConfigurationChannelHostTests.cs @@ -0,0 +1,340 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Microsoft.Agents.Authentication; +using Microsoft.Agents.Core.Models; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Moq; +using System; +using System.Collections.Generic; +using Xunit; + +namespace Microsoft.Agents.Client.Tests +{ + public class ConfigurationChannelHostTests + { + private readonly string _defaultChannel = "webchat"; + + [Fact] + public void Constructor_ShouldThrowOnNullConfigSection() + { + var provider = new Mock(); + var connections = new Mock(); + var config = new Mock(); + + Assert.Throws(() => new ConfigurationChannelHost(provider.Object, connections.Object, config.Object, _defaultChannel, null)); + } + + [Fact] + public void Constructor_ShouldThrowOnEmptyConfigSection() + { + var provider = new Mock(); + var connections = new Mock(); + var config = new Mock(); + + Assert.Throws(() => new ConfigurationChannelHost(provider.Object, connections.Object, config.Object, _defaultChannel, string.Empty)); + } + + [Fact] + public void Constructor_ShouldThrowOnNullServiceProvider() + { + var provider = new Mock(); + var connections = new Mock(); + var config = new Mock(); + + Assert.Throws(() => new ConfigurationChannelHost(null, connections.Object, config.Object, _defaultChannel)); + } + + [Fact] + public void Constructor_ShouldThrowOnNullConnections() + { + var provider = new Mock(); + var config = new Mock(); + + Assert.Throws(() => new ConfigurationChannelHost(provider.Object, null, config.Object, _defaultChannel)); + } + + [Fact] + public void Constructor_ShouldSetChannel() + { + var botId = "bot1"; + var channel = "testing"; + var provider = new Mock(); + var connections = new Mock(); + var sections = new Dictionary{ + {"ChannelHost:Channels:0:Id", botId}, + }; + var config = new ConfigurationBuilder() + .AddInMemoryCollection(sections) + .Build(); + + var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, channel); + + Assert.Single(host.Channels); + Assert.Equal(botId, host.Channels[botId].Id); + Assert.Equal(channel, host.Channels[botId].ChannelFactory); + } + + [Fact] + public void Constructor_ShouldSetHostEndpoint() + { + var endpoint = "http://localhost/"; + var provider = new Mock(); + var connections = new Mock(); + var sections = new Dictionary{ + {"ChannelHost:HostEndpoint", endpoint}, + }; + var config = new ConfigurationBuilder() + .AddInMemoryCollection(sections) + .Build(); + + var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); + + Assert.Equal(endpoint, host.HostEndpoint.ToString()); + } + + [Fact] + public void Constructor_ShouldSetHostAppId() + { + var appId = "123"; + var provider = new Mock(); + var connections = new Mock(); + var sections = new Dictionary{ + {"ChannelHost:HostAppId", appId}, + }; + var config = new ConfigurationBuilder() + .AddInMemoryCollection(sections) + .Build(); + + var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); + + Assert.Equal(appId, host.HostAppId); + } + + [Fact] + public void GetChannel_ShouldThrowOnNullName() + { + var provider = new Mock(); + var connections = new Mock(); + var config = new ConfigurationBuilder().Build(); + + var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); + + Assert.Throws(() => host.GetChannel(string.Empty ?? null)); + } + + [Fact] + public void GetChannel_ShouldThrowOnEmptyName() + { + var provider = new Mock(); + var connections = new Mock(); + var config = new ConfigurationBuilder().Build(); + + var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); + + Assert.Throws(() => host.GetChannel(string.Empty)); + } + + [Fact] + public void GetChannel_ShouldThrowOnUnknownChannel() + { + var provider = new Mock(); + var connections = new Mock(); + var config = new ConfigurationBuilder().Build(); + + var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); + + Assert.Throws(() => host.GetChannel("random")); + } + + [Fact] + public void GetChannel_ShouldThrowOnNullChannel() + { + var provider = new Mock(); + var connections = new Mock(); + var config = new ConfigurationBuilder().Build(); + + var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); + host.Channels.Add(_defaultChannel, null); + + Assert.Throws(() => host.GetChannel(_defaultChannel)); + } + + [Fact] + public void GetChannel_ShouldThrowOnNullChannelFactory() + { + var provider = new Mock(); + var connections = new Mock(); + var config = new ConfigurationBuilder().Build(); + var channelInfo = new Mock(); + + channelInfo.SetupGet(e => e.ChannelFactory) + .Returns(() => null) + .Verifiable(Times.Once); + + var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); + host.Channels.Add(_defaultChannel, channelInfo.Object); + + Assert.Throws(() => host.GetChannel(_defaultChannel)); + Mock.Verify(channelInfo); + } + + [Fact] + public void GetChannel_ShouldThrowOnEmptyChannelFactory() + { + var provider = new Mock(); + var connections = new Mock(); + var config = new ConfigurationBuilder().Build(); + var channelInfo = new Mock(); + + channelInfo.SetupGet(e => e.ChannelFactory) + .Returns(string.Empty) + .Verifiable(Times.Once); + + var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); + host.Channels.Add(_defaultChannel, channelInfo.Object); + + Assert.Throws(() => host.GetChannel(_defaultChannel)); + Mock.Verify(channelInfo); + } + + [Fact] + public void GetChannel_ShouldThrowOnNullKeyedService() + { + var provider = new Mock(); + var connections = new Mock(); + var config = new ConfigurationBuilder().Build(); + var channelInfo = new Mock(); + + channelInfo.SetupGet(e => e.ChannelFactory) + .Returns("factory") + .Verifiable(Times.Exactly(2)); + provider.Setup(e => e.GetKeyedService(It.IsAny(), It.IsAny())) + .Returns(null) + .Verifiable(Times.Once); + + var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); + host.Channels.Add(_defaultChannel, channelInfo.Object); + + Assert.Throws(() => host.GetChannel(_defaultChannel)); + Mock.Verify(provider); + } + + [Fact] + public void GetChannel_ShouldThrowOnNullChannelTokenProvider() + { + var provider = new Mock(); + var connections = new Mock(); + var config = new ConfigurationBuilder().Build(); + var channelInfo = new Mock(); + var channelFactory = new Mock(); + + channelInfo.SetupGet(e => e.ChannelFactory) + .Returns("factory") + .Verifiable(Times.Exactly(2)); + channelInfo.SetupGet(e => e.TokenProvider) + .Returns(() => null) + .Verifiable(Times.Once); + provider.Setup(e => e.GetKeyedService(It.IsAny(), It.IsAny())) + .Returns(channelFactory.Object) + .Verifiable(Times.Once); + + var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); + host.Channels.Add(_defaultChannel, channelInfo.Object); + + Assert.Throws(() => host.GetChannel(_defaultChannel)); + Mock.Verify(channelInfo, provider); + } + + [Fact] + public void GetChannel_ShouldThrowOnEmptyChannelTokenProvider() + { + var provider = new Mock(); + var connections = new Mock(); + var config = new ConfigurationBuilder().Build(); + var channelInfo = new Mock(); + var channelFactory = new Mock(); + + channelInfo.SetupGet(e => e.ChannelFactory) + .Returns("factory") + .Verifiable(Times.Exactly(2)); + channelInfo.SetupGet(e => e.TokenProvider) + .Returns(string.Empty) + .Verifiable(Times.Once); + provider.Setup(e => e.GetKeyedService(It.IsAny(), It.IsAny())) + .Returns(channelFactory.Object) + .Verifiable(Times.Once); + + var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); + host.Channels.Add(_defaultChannel, channelInfo.Object); + + Assert.Throws(() => host.GetChannel(_defaultChannel)); + Mock.Verify(channelInfo, provider); + } + + [Fact] + public void GetChannel_ShouldThrowOnNullConnection() + { + var provider = new Mock(); + var connections = new Mock(); + var config = new ConfigurationBuilder().Build(); + var channelInfo = new Mock(); + var channelFactory = new Mock(); + + channelInfo.SetupGet(e => e.ChannelFactory) + .Returns("factory") + .Verifiable(Times.Exactly(2)); + channelInfo.SetupGet(e => e.TokenProvider) + .Returns("provider") + .Verifiable(Times.Exactly(2)); + provider.Setup(e => e.GetKeyedService(It.IsAny(), It.IsAny())) + .Returns(channelFactory.Object) + .Verifiable(Times.Once); + connections.Setup(e => e.GetConnection(It.IsAny())) + .Returns(null) + .Verifiable(Times.Once); + + var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); + host.Channels.Add(_defaultChannel, channelInfo.Object); + + Assert.Throws(() => host.GetChannel(_defaultChannel)); + Mock.Verify(channelInfo, provider, connections); + } + + [Fact] + public void GetChannel_ShouldReturnChannel() + { + var provider = new Mock(); + var connections = new Mock(); + var config = new ConfigurationBuilder().Build(); + var channelInfo = new Mock(); + var channelFactory = new Mock(); + var token = new Mock(); + var channel = new Mock(); + + channelInfo.SetupGet(e => e.ChannelFactory) + .Returns("factory") + .Verifiable(Times.Exactly(2)); + channelInfo.SetupGet(e => e.TokenProvider) + .Returns("provider") + .Verifiable(Times.Exactly(2)); + provider.Setup(e => e.GetKeyedService(It.IsAny(), It.IsAny())) + .Returns(channelFactory.Object) + .Verifiable(Times.Once); + connections.Setup(e => e.GetConnection(It.IsAny())) + .Returns(token.Object) + .Verifiable(Times.Once); + channelFactory.Setup(e => e.CreateChannel(It.IsAny())) + .Returns(channel.Object) + .Verifiable(Times.Once); + + var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); + host.Channels.Add(_defaultChannel, channelInfo.Object); + var result = host.GetChannel(_defaultChannel); + + Assert.Equal(channel.Object, result); + Mock.Verify(channelInfo, provider, connections, channelFactory); + } + } +} diff --git a/src/tests/Microsoft.Agents.Client.Tests/HttpBotChannelFactoryTests.cs b/src/tests/Microsoft.Agents.Client.Tests/HttpBotChannelFactoryTests.cs new file mode 100644 index 00000000..e4467931 --- /dev/null +++ b/src/tests/Microsoft.Agents.Client.Tests/HttpBotChannelFactoryTests.cs @@ -0,0 +1,44 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Microsoft.Agents.Authentication; +using Microsoft.Agents.Core.Models; +using Microsoft.Extensions.Logging; +using Moq; +using System; +using System.Net.Http; +using Xunit; + +namespace Microsoft.Agents.Client.Tests +{ + public class HttpBotChannelFactoryTests + { + [Fact] + public void Constructor_ShouldThrowOnNullHttpFactory() + { + var logger = new Mock>(); + + Assert.Throws(() => new HttpBotChannelFactory(null, logger.Object)); + } + + [Fact] + public void CreateChannel_ShouldReturnBotChannel() + { + var clientFactory = new Mock(); + var logger = new Mock>(); + var provider = new Mock(); + var httpClient = new Mock(); + + clientFactory.Setup(e => e.CreateClient(It.IsAny())) + .Returns(httpClient.Object) + .Verifiable(Times.Once); + + var channelFactory = new HttpBotChannelFactory(clientFactory.Object, logger.Object); + + var channel = channelFactory.CreateChannel(provider.Object); + + Assert.NotNull(channel); + Mock.Verify(clientFactory); + } + } +} diff --git a/src/tests/Microsoft.Agents.Client.Tests/HttpBotChannelTests.cs b/src/tests/Microsoft.Agents.Client.Tests/HttpBotChannelTests.cs new file mode 100644 index 00000000..f5f93a03 --- /dev/null +++ b/src/tests/Microsoft.Agents.Client.Tests/HttpBotChannelTests.cs @@ -0,0 +1,130 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Microsoft.Agents.Authentication; +using Microsoft.Agents.Core.Models; +using Microsoft.Extensions.Logging; +using Moq; +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.Agents.Client.Tests +{ + public class HttpBotChannelTests + { + private readonly string _toBotId = "botid"; + private readonly string _toBotResource = "botresource"; + private readonly Uri _endpoint = new("http://endpoint"); + private readonly Uri _serviceUrl = new("http://serviceUrl"); + private readonly string _conversationId = "conversationid"; + private readonly Activity _activity = new(conversation: new()); + + [Fact] + public async Task PostActivityAsync_ShouldThrowOnNullEndpoint() + { + var provider = new Mock(); + var factory = new Mock(); + var logger = new Mock(); + var channel = new HttpBotChannel(provider.Object, factory.Object, logger.Object); + + await Assert.ThrowsAsync(() => + channel.PostActivityAsync(_toBotId, _toBotResource, null, _serviceUrl, _conversationId, _activity, CancellationToken.None)); + } + + [Fact] + public async Task PostActivityAsync_ShouldThrowOnNullServiceUrl() + { + var provider = new Mock(); + var factory = new Mock(); + var logger = new Mock(); + var channel = new HttpBotChannel(provider.Object, factory.Object, logger.Object); + + await Assert.ThrowsAsync(() => + channel.PostActivityAsync(_toBotId, _toBotResource, _endpoint, null, _conversationId, _activity, CancellationToken.None)); + } + + [Fact] + public async Task PostActivityAsync_ShouldThrowOnNullConversationId() + { + var provider = new Mock(); + var factory = new Mock(); + var logger = new Mock(); + var channel = new HttpBotChannel(provider.Object, factory.Object, logger.Object); + + await Assert.ThrowsAsync(() => + channel.PostActivityAsync(_toBotId, _toBotResource, _endpoint, _serviceUrl, null, _activity, CancellationToken.None)); + } + + [Fact] + public async Task PostActivityAsync_ShouldThrowOnNullActivity() + { + var provider = new Mock(); + var factory = new Mock(); + var logger = new Mock(); + var channel = new HttpBotChannel(provider.Object, factory.Object, logger.Object); + + await Assert.ThrowsAsync(() => + channel.PostActivityAsync(_toBotId, _toBotResource, _endpoint, _serviceUrl, _conversationId, null, CancellationToken.None)); + } + + [Fact] + public async Task PostActivityAsync_ShouldReturnSuccessfulInvokeResponse() + { + var provider = new Mock(); + var factory = new Mock(); + var logger = new Mock(); + var httpClient = new Mock(); + var content = "{\"text\": \"testing\"}"; + var message = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(content) }; + + provider.Setup(e => e.GetAccessTokenAsync(It.IsAny(), It.Is>(e => e[0].StartsWith(_toBotId)), It.IsAny())) + .ReturnsAsync("token") + .Verifiable(Times.Once); + factory.Setup(e => e.CreateClient(It.IsAny())) + .Returns(httpClient.Object) + .Verifiable(Times.Once); + httpClient.Setup(e => e.SendAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(message) + .Verifiable(Times.Once); + + var channel = new HttpBotChannel(provider.Object, factory.Object, logger.Object); + var response = await channel.PostActivityAsync(_toBotId, _toBotResource, _endpoint, _serviceUrl, _conversationId, _activity, CancellationToken.None); + + Assert.Equal((int)message.StatusCode, response.Status); + Assert.Equal(content, response.Body.ToString()); + Mock.Verify(provider, factory, httpClient); + } + + [Fact] + public async Task PostActivityAsync_ShouldReturnFailedInvokeResponse() + { + var provider = new Mock(); + var factory = new Mock(); + var httpClient = new Mock(); + var content = "{\"text\": \"testing\"}"; + var message = new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new StringContent(content) }; + + provider.Setup(e => e.GetAccessTokenAsync(It.IsAny(), It.Is>(e => e[0].StartsWith(_toBotId)), It.IsAny())) + .ReturnsAsync("token") + .Verifiable(Times.Once); + factory.Setup(e => e.CreateClient(It.IsAny())) + .Returns(httpClient.Object) + .Verifiable(Times.Once); + httpClient.Setup(e => e.SendAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(message) + .Verifiable(Times.Once); + + var channel = new HttpBotChannel(provider.Object, factory.Object, null); + var response = await channel.PostActivityAsync(_toBotId, _toBotResource, _endpoint, _serviceUrl, _conversationId, _activity, CancellationToken.None); + + Assert.Equal((int)message.StatusCode, response.Status); + Assert.Equal(content, response.Body.ToString()); + Mock.Verify(provider, factory, httpClient); + } + } +} From 4bfddf554221eba26e4d6986f0f5a3baebf56c60 Mon Sep 17 00:00:00 2001 From: Joel Mut Date: Tue, 28 Jan 2025 16:58:30 +0000 Subject: [PATCH 2/2] Improve tests by reusing variables --- .../ConfigurationChannelHostTests.cs | 233 +++++------------- .../HttpBotChannelFactoryTests.cs | 24 +- .../HttpBotChannelTests.cs | 50 ++-- 3 files changed, 97 insertions(+), 210 deletions(-) diff --git a/src/tests/Microsoft.Agents.Client.Tests/ConfigurationChannelHostTests.cs b/src/tests/Microsoft.Agents.Client.Tests/ConfigurationChannelHostTests.cs index 9c6df7e4..38b4b283 100644 --- a/src/tests/Microsoft.Agents.Client.Tests/ConfigurationChannelHostTests.cs +++ b/src/tests/Microsoft.Agents.Client.Tests/ConfigurationChannelHostTests.cs @@ -15,111 +15,67 @@ namespace Microsoft.Agents.Client.Tests public class ConfigurationChannelHostTests { private readonly string _defaultChannel = "webchat"; + private readonly Mock _provider = new(); + private readonly Mock _connections = new(); + private readonly IConfigurationRoot _config = new ConfigurationBuilder().Build(); + private readonly Mock _channelInfo = new(); + private readonly Mock _channelFactory = new(); + private readonly Mock _token = new(); + private readonly Mock _channel = new(); [Fact] public void Constructor_ShouldThrowOnNullConfigSection() { - var provider = new Mock(); - var connections = new Mock(); - var config = new Mock(); - - Assert.Throws(() => new ConfigurationChannelHost(provider.Object, connections.Object, config.Object, _defaultChannel, null)); + Assert.Throws(() => new ConfigurationChannelHost(_provider.Object, _connections.Object, _config, _defaultChannel, null)); } [Fact] public void Constructor_ShouldThrowOnEmptyConfigSection() { - var provider = new Mock(); - var connections = new Mock(); - var config = new Mock(); - - Assert.Throws(() => new ConfigurationChannelHost(provider.Object, connections.Object, config.Object, _defaultChannel, string.Empty)); + Assert.Throws(() => new ConfigurationChannelHost(_provider.Object, _connections.Object, _config, _defaultChannel, string.Empty)); } [Fact] public void Constructor_ShouldThrowOnNullServiceProvider() { - var provider = new Mock(); - var connections = new Mock(); - var config = new Mock(); - - Assert.Throws(() => new ConfigurationChannelHost(null, connections.Object, config.Object, _defaultChannel)); + Assert.Throws(() => new ConfigurationChannelHost(null, _connections.Object, _config, _defaultChannel)); } [Fact] public void Constructor_ShouldThrowOnNullConnections() { - var provider = new Mock(); - var config = new Mock(); - - Assert.Throws(() => new ConfigurationChannelHost(provider.Object, null, config.Object, _defaultChannel)); + Assert.Throws(() => new ConfigurationChannelHost(_provider.Object, null, _config, _defaultChannel)); } [Fact] - public void Constructor_ShouldSetChannel() + public void Constructor_ShouldSetProperties() { var botId = "bot1"; + var appId = "123"; var channel = "testing"; - var provider = new Mock(); - var connections = new Mock(); + var endpoint = "http://localhost/"; var sections = new Dictionary{ {"ChannelHost:Channels:0:Id", botId}, + {"ChannelHost:HostEndpoint", endpoint}, + {"ChannelHost:HostAppId", appId}, }; var config = new ConfigurationBuilder() .AddInMemoryCollection(sections) .Build(); - var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, channel); + var host = new ConfigurationChannelHost(_provider.Object, _connections.Object, config, channel); Assert.Single(host.Channels); Assert.Equal(botId, host.Channels[botId].Id); Assert.Equal(channel, host.Channels[botId].ChannelFactory); - } - - [Fact] - public void Constructor_ShouldSetHostEndpoint() - { - var endpoint = "http://localhost/"; - var provider = new Mock(); - var connections = new Mock(); - var sections = new Dictionary{ - {"ChannelHost:HostEndpoint", endpoint}, - }; - var config = new ConfigurationBuilder() - .AddInMemoryCollection(sections) - .Build(); - - var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); - Assert.Equal(endpoint, host.HostEndpoint.ToString()); - } - - [Fact] - public void Constructor_ShouldSetHostAppId() - { - var appId = "123"; - var provider = new Mock(); - var connections = new Mock(); - var sections = new Dictionary{ - {"ChannelHost:HostAppId", appId}, - }; - var config = new ConfigurationBuilder() - .AddInMemoryCollection(sections) - .Build(); - - var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); - Assert.Equal(appId, host.HostAppId); } [Fact] public void GetChannel_ShouldThrowOnNullName() { - var provider = new Mock(); - var connections = new Mock(); - var config = new ConfigurationBuilder().Build(); - - var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); + var host = new ConfigurationChannelHost(_provider.Object, _connections.Object, _config, _defaultChannel); Assert.Throws(() => host.GetChannel(string.Empty ?? null)); } @@ -127,11 +83,7 @@ public void GetChannel_ShouldThrowOnNullName() [Fact] public void GetChannel_ShouldThrowOnEmptyName() { - var provider = new Mock(); - var connections = new Mock(); - var config = new ConfigurationBuilder().Build(); - - var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); + var host = new ConfigurationChannelHost(_provider.Object, _connections.Object, _config, _defaultChannel); Assert.Throws(() => host.GetChannel(string.Empty)); } @@ -139,11 +91,7 @@ public void GetChannel_ShouldThrowOnEmptyName() [Fact] public void GetChannel_ShouldThrowOnUnknownChannel() { - var provider = new Mock(); - var connections = new Mock(); - var config = new ConfigurationBuilder().Build(); - - var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); + var host = new ConfigurationChannelHost(_provider.Object, _connections.Object, _config, _defaultChannel); Assert.Throws(() => host.GetChannel("random")); } @@ -151,11 +99,7 @@ public void GetChannel_ShouldThrowOnUnknownChannel() [Fact] public void GetChannel_ShouldThrowOnNullChannel() { - var provider = new Mock(); - var connections = new Mock(); - var config = new ConfigurationBuilder().Build(); - - var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); + var host = new ConfigurationChannelHost(_provider.Object, _connections.Object, _config, _defaultChannel); host.Channels.Add(_defaultChannel, null); Assert.Throws(() => host.GetChannel(_defaultChannel)); @@ -164,177 +108,136 @@ public void GetChannel_ShouldThrowOnNullChannel() [Fact] public void GetChannel_ShouldThrowOnNullChannelFactory() { - var provider = new Mock(); - var connections = new Mock(); - var config = new ConfigurationBuilder().Build(); - var channelInfo = new Mock(); - - channelInfo.SetupGet(e => e.ChannelFactory) + _channelInfo.SetupGet(e => e.ChannelFactory) .Returns(() => null) .Verifiable(Times.Once); - var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); - host.Channels.Add(_defaultChannel, channelInfo.Object); + var host = new ConfigurationChannelHost(_provider.Object, _connections.Object, _config, _defaultChannel); + host.Channels.Add(_defaultChannel, _channelInfo.Object); Assert.Throws(() => host.GetChannel(_defaultChannel)); - Mock.Verify(channelInfo); + Mock.Verify(_channelInfo); } [Fact] public void GetChannel_ShouldThrowOnEmptyChannelFactory() { - var provider = new Mock(); - var connections = new Mock(); - var config = new ConfigurationBuilder().Build(); - var channelInfo = new Mock(); - - channelInfo.SetupGet(e => e.ChannelFactory) + _channelInfo.SetupGet(e => e.ChannelFactory) .Returns(string.Empty) .Verifiable(Times.Once); - var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); - host.Channels.Add(_defaultChannel, channelInfo.Object); + var host = new ConfigurationChannelHost(_provider.Object, _connections.Object, _config, _defaultChannel); + host.Channels.Add(_defaultChannel, _channelInfo.Object); Assert.Throws(() => host.GetChannel(_defaultChannel)); - Mock.Verify(channelInfo); + Mock.Verify(_channelInfo); } [Fact] public void GetChannel_ShouldThrowOnNullKeyedService() { - var provider = new Mock(); - var connections = new Mock(); - var config = new ConfigurationBuilder().Build(); - var channelInfo = new Mock(); - - channelInfo.SetupGet(e => e.ChannelFactory) + _channelInfo.SetupGet(e => e.ChannelFactory) .Returns("factory") .Verifiable(Times.Exactly(2)); - provider.Setup(e => e.GetKeyedService(It.IsAny(), It.IsAny())) + _provider.Setup(e => e.GetKeyedService(It.IsAny(), It.IsAny())) .Returns(null) .Verifiable(Times.Once); - var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); - host.Channels.Add(_defaultChannel, channelInfo.Object); + var host = new ConfigurationChannelHost(_provider.Object, _connections.Object, _config, _defaultChannel); + host.Channels.Add(_defaultChannel, _channelInfo.Object); Assert.Throws(() => host.GetChannel(_defaultChannel)); - Mock.Verify(provider); + Mock.Verify(_provider); } [Fact] public void GetChannel_ShouldThrowOnNullChannelTokenProvider() { - var provider = new Mock(); - var connections = new Mock(); - var config = new ConfigurationBuilder().Build(); - var channelInfo = new Mock(); - var channelFactory = new Mock(); - - channelInfo.SetupGet(e => e.ChannelFactory) + _channelInfo.SetupGet(e => e.ChannelFactory) .Returns("factory") .Verifiable(Times.Exactly(2)); - channelInfo.SetupGet(e => e.TokenProvider) + _channelInfo.SetupGet(e => e.TokenProvider) .Returns(() => null) .Verifiable(Times.Once); - provider.Setup(e => e.GetKeyedService(It.IsAny(), It.IsAny())) - .Returns(channelFactory.Object) + _provider.Setup(e => e.GetKeyedService(It.IsAny(), It.IsAny())) + .Returns(_channelFactory.Object) .Verifiable(Times.Once); - var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); - host.Channels.Add(_defaultChannel, channelInfo.Object); + var host = new ConfigurationChannelHost(_provider.Object, _connections.Object, _config, _defaultChannel); + host.Channels.Add(_defaultChannel, _channelInfo.Object); Assert.Throws(() => host.GetChannel(_defaultChannel)); - Mock.Verify(channelInfo, provider); + Mock.Verify(_channelInfo, _provider); } [Fact] public void GetChannel_ShouldThrowOnEmptyChannelTokenProvider() { - var provider = new Mock(); - var connections = new Mock(); - var config = new ConfigurationBuilder().Build(); - var channelInfo = new Mock(); - var channelFactory = new Mock(); - - channelInfo.SetupGet(e => e.ChannelFactory) + _channelInfo.SetupGet(e => e.ChannelFactory) .Returns("factory") .Verifiable(Times.Exactly(2)); - channelInfo.SetupGet(e => e.TokenProvider) + _channelInfo.SetupGet(e => e.TokenProvider) .Returns(string.Empty) .Verifiable(Times.Once); - provider.Setup(e => e.GetKeyedService(It.IsAny(), It.IsAny())) - .Returns(channelFactory.Object) + _provider.Setup(e => e.GetKeyedService(It.IsAny(), It.IsAny())) + .Returns(_channelFactory.Object) .Verifiable(Times.Once); - var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); - host.Channels.Add(_defaultChannel, channelInfo.Object); + var host = new ConfigurationChannelHost(_provider.Object, _connections.Object, _config, _defaultChannel); + host.Channels.Add(_defaultChannel, _channelInfo.Object); Assert.Throws(() => host.GetChannel(_defaultChannel)); - Mock.Verify(channelInfo, provider); + Mock.Verify(_channelInfo, _provider); } [Fact] public void GetChannel_ShouldThrowOnNullConnection() { - var provider = new Mock(); - var connections = new Mock(); - var config = new ConfigurationBuilder().Build(); - var channelInfo = new Mock(); - var channelFactory = new Mock(); - - channelInfo.SetupGet(e => e.ChannelFactory) + _channelInfo.SetupGet(e => e.ChannelFactory) .Returns("factory") .Verifiable(Times.Exactly(2)); - channelInfo.SetupGet(e => e.TokenProvider) + _channelInfo.SetupGet(e => e.TokenProvider) .Returns("provider") .Verifiable(Times.Exactly(2)); - provider.Setup(e => e.GetKeyedService(It.IsAny(), It.IsAny())) - .Returns(channelFactory.Object) + _provider.Setup(e => e.GetKeyedService(It.IsAny(), It.IsAny())) + .Returns(_channelFactory.Object) .Verifiable(Times.Once); - connections.Setup(e => e.GetConnection(It.IsAny())) + _connections.Setup(e => e.GetConnection(It.IsAny())) .Returns(null) .Verifiable(Times.Once); - var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); - host.Channels.Add(_defaultChannel, channelInfo.Object); + var host = new ConfigurationChannelHost(_provider.Object, _connections.Object, _config, _defaultChannel); + host.Channels.Add(_defaultChannel, _channelInfo.Object); Assert.Throws(() => host.GetChannel(_defaultChannel)); - Mock.Verify(channelInfo, provider, connections); + Mock.Verify(_channelInfo, _provider, _connections); } [Fact] public void GetChannel_ShouldReturnChannel() { - var provider = new Mock(); - var connections = new Mock(); - var config = new ConfigurationBuilder().Build(); - var channelInfo = new Mock(); - var channelFactory = new Mock(); - var token = new Mock(); - var channel = new Mock(); - - channelInfo.SetupGet(e => e.ChannelFactory) + _channelInfo.SetupGet(e => e.ChannelFactory) .Returns("factory") .Verifiable(Times.Exactly(2)); - channelInfo.SetupGet(e => e.TokenProvider) + _channelInfo.SetupGet(e => e.TokenProvider) .Returns("provider") .Verifiable(Times.Exactly(2)); - provider.Setup(e => e.GetKeyedService(It.IsAny(), It.IsAny())) - .Returns(channelFactory.Object) + _provider.Setup(e => e.GetKeyedService(It.IsAny(), It.IsAny())) + .Returns(_channelFactory.Object) .Verifiable(Times.Once); - connections.Setup(e => e.GetConnection(It.IsAny())) - .Returns(token.Object) + _connections.Setup(e => e.GetConnection(It.IsAny())) + .Returns(_token.Object) .Verifiable(Times.Once); - channelFactory.Setup(e => e.CreateChannel(It.IsAny())) - .Returns(channel.Object) + _channelFactory.Setup(e => e.CreateChannel(It.IsAny())) + .Returns(_channel.Object) .Verifiable(Times.Once); - var host = new ConfigurationChannelHost(provider.Object, connections.Object, config, _defaultChannel); - host.Channels.Add(_defaultChannel, channelInfo.Object); + var host = new ConfigurationChannelHost(_provider.Object, _connections.Object, _config, _defaultChannel); + host.Channels.Add(_defaultChannel, _channelInfo.Object); var result = host.GetChannel(_defaultChannel); - Assert.Equal(channel.Object, result); - Mock.Verify(channelInfo, provider, connections, channelFactory); + Assert.Equal(_channel.Object, result); + Mock.Verify(_channelInfo, _provider, _connections, _channelFactory); } } } diff --git a/src/tests/Microsoft.Agents.Client.Tests/HttpBotChannelFactoryTests.cs b/src/tests/Microsoft.Agents.Client.Tests/HttpBotChannelFactoryTests.cs index e4467931..c4faa67e 100644 --- a/src/tests/Microsoft.Agents.Client.Tests/HttpBotChannelFactoryTests.cs +++ b/src/tests/Microsoft.Agents.Client.Tests/HttpBotChannelFactoryTests.cs @@ -13,32 +13,30 @@ namespace Microsoft.Agents.Client.Tests { public class HttpBotChannelFactoryTests { + private readonly Mock _clientFactory = new(); + private readonly Mock> _logger = new(); + private readonly Mock _provider = new(); + private readonly Mock _httpClient = new(); + [Fact] public void Constructor_ShouldThrowOnNullHttpFactory() { - var logger = new Mock>(); - - Assert.Throws(() => new HttpBotChannelFactory(null, logger.Object)); + Assert.Throws(() => new HttpBotChannelFactory(null, _logger.Object)); } [Fact] public void CreateChannel_ShouldReturnBotChannel() { - var clientFactory = new Mock(); - var logger = new Mock>(); - var provider = new Mock(); - var httpClient = new Mock(); - - clientFactory.Setup(e => e.CreateClient(It.IsAny())) - .Returns(httpClient.Object) + _clientFactory.Setup(e => e.CreateClient(It.IsAny())) + .Returns(_httpClient.Object) .Verifiable(Times.Once); - var channelFactory = new HttpBotChannelFactory(clientFactory.Object, logger.Object); + var channelFactory = new HttpBotChannelFactory(_clientFactory.Object, _logger.Object); - var channel = channelFactory.CreateChannel(provider.Object); + var channel = channelFactory.CreateChannel(_provider.Object); Assert.NotNull(channel); - Mock.Verify(clientFactory); + Mock.Verify(_clientFactory); } } } diff --git a/src/tests/Microsoft.Agents.Client.Tests/HttpBotChannelTests.cs b/src/tests/Microsoft.Agents.Client.Tests/HttpBotChannelTests.cs index f5f93a03..69e1c2ad 100644 --- a/src/tests/Microsoft.Agents.Client.Tests/HttpBotChannelTests.cs +++ b/src/tests/Microsoft.Agents.Client.Tests/HttpBotChannelTests.cs @@ -23,14 +23,15 @@ public class HttpBotChannelTests private readonly Uri _serviceUrl = new("http://serviceUrl"); private readonly string _conversationId = "conversationid"; private readonly Activity _activity = new(conversation: new()); + private readonly Mock _provider = new(); + private readonly Mock _factory = new(); + private readonly Mock _logger = new(); + private readonly Mock _httpClient = new(); [Fact] public async Task PostActivityAsync_ShouldThrowOnNullEndpoint() { - var provider = new Mock(); - var factory = new Mock(); - var logger = new Mock(); - var channel = new HttpBotChannel(provider.Object, factory.Object, logger.Object); + var channel = new HttpBotChannel(_provider.Object, _factory.Object, _logger.Object); await Assert.ThrowsAsync(() => channel.PostActivityAsync(_toBotId, _toBotResource, null, _serviceUrl, _conversationId, _activity, CancellationToken.None)); @@ -39,10 +40,7 @@ await Assert.ThrowsAsync(() => [Fact] public async Task PostActivityAsync_ShouldThrowOnNullServiceUrl() { - var provider = new Mock(); - var factory = new Mock(); - var logger = new Mock(); - var channel = new HttpBotChannel(provider.Object, factory.Object, logger.Object); + var channel = new HttpBotChannel(_provider.Object, _factory.Object, _logger.Object); await Assert.ThrowsAsync(() => channel.PostActivityAsync(_toBotId, _toBotResource, _endpoint, null, _conversationId, _activity, CancellationToken.None)); @@ -51,10 +49,7 @@ await Assert.ThrowsAsync(() => [Fact] public async Task PostActivityAsync_ShouldThrowOnNullConversationId() { - var provider = new Mock(); - var factory = new Mock(); - var logger = new Mock(); - var channel = new HttpBotChannel(provider.Object, factory.Object, logger.Object); + var channel = new HttpBotChannel(_provider.Object, _factory.Object, _logger.Object); await Assert.ThrowsAsync(() => channel.PostActivityAsync(_toBotId, _toBotResource, _endpoint, _serviceUrl, null, _activity, CancellationToken.None)); @@ -63,10 +58,7 @@ await Assert.ThrowsAsync(() => [Fact] public async Task PostActivityAsync_ShouldThrowOnNullActivity() { - var provider = new Mock(); - var factory = new Mock(); - var logger = new Mock(); - var channel = new HttpBotChannel(provider.Object, factory.Object, logger.Object); + var channel = new HttpBotChannel(_provider.Object, _factory.Object, _logger.Object); await Assert.ThrowsAsync(() => channel.PostActivityAsync(_toBotId, _toBotResource, _endpoint, _serviceUrl, _conversationId, null, CancellationToken.None)); @@ -75,56 +67,50 @@ await Assert.ThrowsAsync(() => [Fact] public async Task PostActivityAsync_ShouldReturnSuccessfulInvokeResponse() { - var provider = new Mock(); - var factory = new Mock(); - var logger = new Mock(); var httpClient = new Mock(); var content = "{\"text\": \"testing\"}"; var message = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(content) }; - provider.Setup(e => e.GetAccessTokenAsync(It.IsAny(), It.Is>(e => e[0].StartsWith(_toBotId)), It.IsAny())) + _provider.Setup(e => e.GetAccessTokenAsync(It.IsAny(), It.Is>(e => e[0].StartsWith(_toBotId)), It.IsAny())) .ReturnsAsync("token") .Verifiable(Times.Once); - factory.Setup(e => e.CreateClient(It.IsAny())) + _factory.Setup(e => e.CreateClient(It.IsAny())) .Returns(httpClient.Object) .Verifiable(Times.Once); httpClient.Setup(e => e.SendAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(message) .Verifiable(Times.Once); - var channel = new HttpBotChannel(provider.Object, factory.Object, logger.Object); + var channel = new HttpBotChannel(_provider.Object, _factory.Object, _logger.Object); var response = await channel.PostActivityAsync(_toBotId, _toBotResource, _endpoint, _serviceUrl, _conversationId, _activity, CancellationToken.None); Assert.Equal((int)message.StatusCode, response.Status); Assert.Equal(content, response.Body.ToString()); - Mock.Verify(provider, factory, httpClient); + Mock.Verify(_provider, _factory, httpClient); } [Fact] public async Task PostActivityAsync_ShouldReturnFailedInvokeResponse() { - var provider = new Mock(); - var factory = new Mock(); - var httpClient = new Mock(); var content = "{\"text\": \"testing\"}"; var message = new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new StringContent(content) }; - provider.Setup(e => e.GetAccessTokenAsync(It.IsAny(), It.Is>(e => e[0].StartsWith(_toBotId)), It.IsAny())) + _provider.Setup(e => e.GetAccessTokenAsync(It.IsAny(), It.Is>(e => e[0].StartsWith(_toBotId)), It.IsAny())) .ReturnsAsync("token") .Verifiable(Times.Once); - factory.Setup(e => e.CreateClient(It.IsAny())) - .Returns(httpClient.Object) + _factory.Setup(e => e.CreateClient(It.IsAny())) + .Returns(_httpClient.Object) .Verifiable(Times.Once); - httpClient.Setup(e => e.SendAsync(It.IsAny(), It.IsAny())) + _httpClient.Setup(e => e.SendAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(message) .Verifiable(Times.Once); - var channel = new HttpBotChannel(provider.Object, factory.Object, null); + var channel = new HttpBotChannel(_provider.Object, _factory.Object, null); var response = await channel.PostActivityAsync(_toBotId, _toBotResource, _endpoint, _serviceUrl, _conversationId, _activity, CancellationToken.None); Assert.Equal((int)message.StatusCode, response.Status); Assert.Equal(content, response.Body.ToString()); - Mock.Verify(provider, factory, httpClient); + Mock.Verify(_provider, _factory, _httpClient); } } }