microsoft/teams.net

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
9dfef728feacaff7db1ea1762d5ccde4d6a434ff

Branches

Tags

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

Clone

HTTPS

Download ZIP

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

225lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4using System.Text;
5using Microsoft.AspNetCore.Http;
6using Microsoft.Bot.Core.Schema;
7using Microsoft.Extensions.Configuration;
8using Microsoft.Extensions.Logging.Abstractions;
9using Moq;
10
11namespace Microsoft.Bot.Core.UnitTests;
12
13public class MiddlewareTests
14{
15 [Fact]
16 public async Task BotApplication_Use_AddsMiddlewareToChain()
17 {
18 ConversationClient conversationClient = CreateMockConversationClient();
19 Mock<IConfiguration> mockConfig = new();
20 NullLogger<BotApplication> logger = NullLogger<BotApplication>.Instance;
21 BotApplication botApp = new(conversationClient, mockConfig.Object, logger);
22
23 Mock<ITurnMiddleWare> mockMiddleware = new();
24
25 ITurnMiddleWare result = botApp.Use(mockMiddleware.Object);
26
27 Assert.NotNull(result);
28 }
29
30
31 [Fact]
32 public async Task Middleware_ExecutesInOrder()
33 {
34 ConversationClient conversationClient = CreateMockConversationClient();
35 Mock<IConfiguration> mockConfig = new();
36 NullLogger<BotApplication> logger = NullLogger<BotApplication>.Instance;
37 BotApplication botApp = new(conversationClient, mockConfig.Object, logger);
38
39 List<int> executionOrder = new();
40
41 Mock<ITurnMiddleWare> mockMiddleware1 = new();
42 mockMiddleware1
43 .Setup(m => m.OnTurnAsync(It.IsAny<BotApplication>(), It.IsAny<CoreActivity>(), It.IsAny<NextTurn>(), It.IsAny<CancellationToken>()))
44 .Callback<BotApplication, CoreActivity, NextTurn, CancellationToken>(async (app, act, next, ct) =>
45 {
46 executionOrder.Add(1);
47 await next(ct);
48 })
49 .Returns(Task.CompletedTask);
50
51 Mock<ITurnMiddleWare> mockMiddleware2 = new();
52 mockMiddleware2
53 .Setup(m => m.OnTurnAsync(It.IsAny<BotApplication>(), It.IsAny<CoreActivity>(), It.IsAny<NextTurn>(), It.IsAny<CancellationToken>()))
54 .Callback<BotApplication, CoreActivity, NextTurn, CancellationToken>(async (app, act, next, ct) =>
55 {
56 executionOrder.Add(2);
57 await next(ct);
58 })
59 .Returns(Task.CompletedTask);
60
61 botApp.Use(mockMiddleware1.Object);
62 botApp.Use(mockMiddleware2.Object);
63
64 CoreActivity activity = new()
65 {
66 Type = ActivityTypes.Message,
67 Text = "Test message",
68 Id = "act123"
69 };
70 activity.Recipient.Properties["appId"] = "test-app-id";
71
72 DefaultHttpContext httpContext = CreateHttpContextWithActivity(activity);
73
74 botApp.OnActivity = (act, ct) =>
75 {
76 executionOrder.Add(3);
77 return Task.CompletedTask;
78 };
79
80 await botApp.ProcessAsync(httpContext);
81 int[] expected = [1, 2, 3];
82 Assert.Equal(expected, executionOrder);
83 }
84
85 [Fact]
86 public async Task Middleware_CanShortCircuit()
87 {
88 ConversationClient conversationClient = CreateMockConversationClient();
89 Mock<IConfiguration> mockConfig = new();
90 NullLogger<BotApplication> logger = NullLogger<BotApplication>.Instance;
91 BotApplication botApp = new(conversationClient, mockConfig.Object, logger);
92
93 bool secondMiddlewareCalled = false;
94 bool onActivityCalled = false;
95
96 Mock<ITurnMiddleWare> mockMiddleware1 = new();
97 mockMiddleware1
98 .Setup(m => m.OnTurnAsync(It.IsAny<BotApplication>(), It.IsAny<CoreActivity>(), It.IsAny<NextTurn>(), It.IsAny<CancellationToken>()))
99 .Returns(Task.CompletedTask); // Don't call next
100
101 Mock<ITurnMiddleWare> mockMiddleware2 = new();
102 mockMiddleware2
103 .Setup(m => m.OnTurnAsync(It.IsAny<BotApplication>(), It.IsAny<CoreActivity>(), It.IsAny<NextTurn>(), It.IsAny<CancellationToken>()))
104 .Callback(() => secondMiddlewareCalled = true)
105 .Returns(Task.CompletedTask);
106
107 botApp.Use(mockMiddleware1.Object);
108 botApp.Use(mockMiddleware2.Object);
109
110 CoreActivity activity = new()
111 {
112 Type = ActivityTypes.Message,
113 Text = "Test message",
114 Id = "act123"
115 };
116 activity.Recipient.Properties["appId"] = "test-app-id";
117
118 DefaultHttpContext httpContext = CreateHttpContextWithActivity(activity);
119
120 botApp.OnActivity = (act, ct) =>
121 {
122 onActivityCalled = true;
123 return Task.CompletedTask;
124 };
125
126 await botApp.ProcessAsync(httpContext);
127
128 Assert.False(secondMiddlewareCalled);
129 Assert.False(onActivityCalled);
130 }
131
132 [Fact]
133 public async Task Middleware_ReceivesCancellationToken()
134 {
135 ConversationClient conversationClient = CreateMockConversationClient();
136 Mock<IConfiguration> mockConfig = new();
137 NullLogger<BotApplication> logger = NullLogger<BotApplication>.Instance;
138 BotApplication botApp = new(conversationClient, mockConfig.Object, logger);
139
140 CancellationToken receivedToken = default;
141
142 Mock<ITurnMiddleWare> mockMiddleware = new();
143 mockMiddleware
144 .Setup(m => m.OnTurnAsync(It.IsAny<BotApplication>(), It.IsAny<CoreActivity>(), It.IsAny<NextTurn>(), It.IsAny<CancellationToken>()))
145 .Callback<BotApplication, CoreActivity, NextTurn, CancellationToken>(async (app, act, next, ct) =>
146 {
147 receivedToken = ct;
148 await next(ct);
149 })
150 .Returns(Task.CompletedTask);
151
152 botApp.Use(mockMiddleware.Object);
153
154 CoreActivity activity = new()
155 {
156 Type = ActivityTypes.Message,
157 Text = "Test message",
158 Id = "act123"
159 };
160 activity.Recipient.Properties["appId"] = "test-app-id";
161
162 DefaultHttpContext httpContext = CreateHttpContextWithActivity(activity);
163
164 CancellationTokenSource cts = new();
165
166 await botApp.ProcessAsync(httpContext, cts.Token);
167
168 Assert.Equal(cts.Token, receivedToken);
169 }
170
171 [Fact]
172 public async Task Middleware_ReceivesActivity()
173 {
174 ConversationClient conversationClient = CreateMockConversationClient();
175 Mock<IConfiguration> mockConfig = new();
176 NullLogger<BotApplication> logger = NullLogger<BotApplication>.Instance;
177 BotApplication botApp = new(conversationClient, mockConfig.Object, logger);
178
179 CoreActivity? receivedActivity = null;
180
181 Mock<ITurnMiddleWare> mockMiddleware = new();
182 mockMiddleware
183 .Setup(m => m.OnTurnAsync(It.IsAny<BotApplication>(), It.IsAny<CoreActivity>(), It.IsAny<NextTurn>(), It.IsAny<CancellationToken>()))
184 .Callback<BotApplication, CoreActivity, NextTurn, CancellationToken>(async (app, act, next, ct) =>
185 {
186 receivedActivity = act;
187 await next(ct);
188 })
189 .Returns(Task.CompletedTask);
190
191 botApp.Use(mockMiddleware.Object);
192
193 CoreActivity activity = new()
194 {
195 Type = ActivityTypes.Message,
196 Text = "Test message",
197 Id = "act123"
198 };
199 activity.Recipient.Properties["appId"] = "test-app-id";
200
201 DefaultHttpContext httpContext = CreateHttpContextWithActivity(activity);
202
203 await botApp.ProcessAsync(httpContext);
204
205 Assert.NotNull(receivedActivity);
206 Assert.Equal(ActivityTypes.Message, receivedActivity.Type);
207 Assert.Equal("Test message", receivedActivity.Text);
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}
226