microsoft/teams.net

Public

mirrored from https://github.com/microsoft/teams.netAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
copilot/move-activity-implementations

Branches

Tags

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

Clone

HTTPS

Download ZIP

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

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