microsoft/teams.net

Public

mirrored fromhttps://github.com/microsoft/teams.netAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
74588b33035a67444a68e0299b0b92494fa76c4a

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

core/test/Microsoft.Teams.Core.UnitTests/BotApplicationTests.cs

217lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4using System.Net;
5using System.Text;
6using Microsoft.AspNetCore.Http;
7using Microsoft.Extensions.Configuration;
8using Microsoft.Extensions.Logging.Abstractions;
9using Microsoft.Teams.Core.Hosting;
10using Microsoft.Teams.Core.Schema;
11using Moq;
12using Moq.Protected;
13
14namespace Microsoft.Teams.Core.UnitTests;
15
16public class BotApplicationTests
17{
18 [Fact]
19 public void Constructor_InitializesProperties()
20 {
21 ConversationClient conversationClient = CreateMockConversationClient();
22 UserTokenClient userTokenClient = CreateMockUserTokenClient();
23 NullLogger<BotApplication> logger = NullLogger<BotApplication>.Instance;
24
25 BotApplication botApp = new(conversationClient, userTokenClient, logger, CreateOptions("test-app-id"));
26 Assert.NotNull(botApp);
27 Assert.NotNull(botApp.ConversationClient);
28 Assert.NotNull(botApp.UserTokenClient);
29 Assert.NotNull(botApp.UserTokenClient);
30 }
31
32
33
34 [Fact]
35 public async Task ProcessAsync_WithNullHttpContext_ThrowsArgumentNullException()
36 {
37 BotApplication botApp = CreateBotApplication();
38
39 await Assert.ThrowsAsync<ArgumentNullException>(() =>
40 botApp.ProcessAsync(null!));
41 }
42
43 [Fact]
44 public async Task ProcessAsync_WithValidActivity_ProcessesSuccessfully()
45 {
46 BotApplication botApp = CreateBotApplication();
47
48 CoreActivity activity = new()
49 {
50 Type = ActivityType.Message,
51 Id = "act123"
52 };
53 activity.Properties["text"] = "Test message";
54
55
56 DefaultHttpContext httpContext = CreateHttpContextWithActivity(activity);
57
58 bool onActivityCalled = false;
59 botApp.OnActivity = (act, ct) =>
60 {
61 onActivityCalled = true;
62 return Task.CompletedTask;
63 };
64
65 await botApp.ProcessAsync(httpContext);
66
67 Assert.True(onActivityCalled);
68 }
69
70 [Fact]
71 public async Task ProcessAsync_WithMiddleware_ExecutesMiddleware()
72 {
73 BotApplication botApp = CreateBotApplication();
74
75 CoreActivity activity = new()
76 {
77 Type = ActivityType.Message,
78 Id = "act123"
79 };
80
81 DefaultHttpContext httpContext = CreateHttpContextWithActivity(activity);
82
83 bool middlewareCalled = false;
84 Mock<ITurnMiddleware> mockMiddleware = new();
85 mockMiddleware
86 .Setup(m => m.OnTurnAsync(It.IsAny<BotApplication>(), It.IsAny<CoreActivity>(), It.IsAny<NextTurn>(), It.IsAny<CancellationToken>()))
87 .Callback<BotApplication, CoreActivity, NextTurn, CancellationToken>(async (app, act, next, ct) =>
88 {
89 middlewareCalled = true;
90 await next(ct);
91 })
92 .Returns(Task.CompletedTask);
93
94 botApp.UseMiddleware(mockMiddleware.Object);
95
96 bool onActivityCalled = false;
97 botApp.OnActivity = (act, ct) =>
98 {
99 onActivityCalled = true;
100 return Task.CompletedTask;
101 };
102
103 await botApp.ProcessAsync(httpContext);
104
105 Assert.True(middlewareCalled);
106 Assert.True(onActivityCalled);
107 }
108
109 [Fact]
110 public async Task ProcessAsync_WithException_ThrowsBotHandlerException()
111 {
112 BotApplication botApp = CreateBotApplication();
113
114 CoreActivity activity = new()
115 {
116 Type = ActivityType.Message,
117 Id = "act123"
118 };
119
120
121 DefaultHttpContext httpContext = CreateHttpContextWithActivity(activity);
122
123 botApp.OnActivity = (act, ct) => throw new InvalidOperationException("Test exception");
124
125 BotHandlerException exception = await Assert.ThrowsAsync<BotHandlerException>(() =>
126 botApp.ProcessAsync(httpContext));
127
128 Assert.Equal("Error processing activity", exception.Message);
129 Assert.IsType<InvalidOperationException>(exception.InnerException);
130 }
131
132 [Fact]
133 public void Use_AddsMiddlewareToChain()
134 {
135 BotApplication botApp = CreateBotApplication();
136
137 Mock<ITurnMiddleware> mockMiddleware = new();
138
139 ITurnMiddleware result = botApp.UseMiddleware(mockMiddleware.Object);
140
141 Assert.NotNull(result);
142 }
143
144 [Fact]
145 public async Task SendActivityAsync_WithValidActivity_SendsSuccessfully()
146 {
147 Mock<HttpMessageHandler> mockHttpMessageHandler = new();
148 mockHttpMessageHandler
149 .Protected()
150 .Setup<Task<HttpResponseMessage>>(
151 "SendAsync",
152 ItExpr.IsAny<HttpRequestMessage>(),
153 ItExpr.IsAny<CancellationToken>())
154 .ReturnsAsync(new HttpResponseMessage
155 {
156 StatusCode = HttpStatusCode.OK,
157 Content = new StringContent("{\"id\":\"activity123\"}")
158 });
159
160 HttpClient httpClient = new(mockHttpMessageHandler.Object);
161 ConversationClient conversationClient = new(httpClient);
162 UserTokenClient userTokenClient = CreateMockUserTokenClient();
163 NullLogger<BotApplication> logger = NullLogger<BotApplication>.Instance;
164 BotApplication botApp = new(conversationClient, userTokenClient, logger);
165
166 CoreActivity activity = new()
167 {
168 Type = ActivityType.Message,
169 ServiceUrl = new Uri("https://test.service.url/")
170 };
171
172 activity.Conversation = new("conv123");
173 SendActivityResponse? result = await botApp.SendActivityAsync(activity);
174
175 Assert.NotNull(result);
176 Assert.Contains("activity123", result.Id);
177 }
178
179 [Fact]
180 public async Task SendActivityAsync_WithNullActivity_ThrowsArgumentNullException()
181 {
182 BotApplication botApp = CreateBotApplication();
183
184 await Assert.ThrowsAsync<ArgumentNullException>(() =>
185 botApp.SendActivityAsync(null!));
186 }
187
188 private static BotApplicationOptions CreateOptions(string appId) =>
189 new() { AppId = appId };
190
191 private static BotApplication CreateBotApplication() =>
192 new(CreateMockConversationClient(), CreateMockUserTokenClient(), NullLogger<BotApplication>.Instance);
193
194 private static ConversationClient CreateMockConversationClient()
195 {
196 Mock<HttpClient> mockHttpClient = new();
197 return new ConversationClient(mockHttpClient.Object);
198 }
199
200 private static UserTokenClient CreateMockUserTokenClient()
201 {
202 Mock<HttpClient> mockHttpClient = new();
203 NullLogger<UserTokenClient> logger = NullLogger<UserTokenClient>.Instance;
204 Mock<IConfiguration> mockConfiguration = new();
205 return new UserTokenClient(mockHttpClient.Object, mockConfiguration.Object, logger);
206 }
207
208 private static DefaultHttpContext CreateHttpContextWithActivity(CoreActivity activity)
209 {
210 DefaultHttpContext httpContext = new();
211 string activityJson = activity.ToJson();
212 byte[] bodyBytes = Encoding.UTF8.GetBytes(activityJson);
213 httpContext.Request.Body = new MemoryStream(bodyBytes);
214 httpContext.Request.ContentType = "application/json";
215 return httpContext;
216 }
217}
218