microsoft/teams.net

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
copilot/sub-pr-338

Branches

Tags

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

Clone

HTTPS

Download ZIP

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

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