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/CoreActivityBuilderTests.cs

541lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4using Microsoft.Teams.Bot.Core.Schema;
5
6namespace Microsoft.Teams.Bot.Core.UnitTests;
7
8public class CoreActivityBuilderTests
9{
10 [Fact]
11 public void Constructor_DefaultConstructor_CreatesNewActivity()
12 {
13 CoreActivityBuilder builder = new();
14 CoreActivity activity = builder.Build();
15
16 Assert.NotNull(activity);
17 Assert.NotNull(activity.From);
18 Assert.NotNull(activity.Recipient);
19 Assert.NotNull(activity.Conversation);
20 }
21
22 [Fact]
23 public void Constructor_WithExistingActivity_UsesProvidedActivity()
24 {
25 CoreActivity existingActivity = new()
26 {
27 Id = "test-id",
28 };
29
30 CoreActivityBuilder builder = new(existingActivity);
31 CoreActivity activity = builder.Build();
32
33 Assert.Equal("test-id", activity.Id);
34 }
35
36 [Fact]
37 public void Constructor_WithNullActivity_ThrowsArgumentNullException()
38 {
39 Assert.Throws<ArgumentNullException>(() => new CoreActivityBuilder(null!));
40 }
41
42 [Fact]
43 public void WithId_SetsActivityId()
44 {
45 CoreActivity activity = new CoreActivityBuilder()
46 .WithId("test-activity-id")
47 .Build();
48
49 Assert.Equal("test-activity-id", activity.Id);
50 }
51
52 [Fact]
53 public void WithServiceUrl_SetsServiceUrl()
54 {
55 Uri serviceUrl = new("https://smba.trafficmanager.net/teams/");
56
57 CoreActivity activity = new CoreActivityBuilder()
58 .WithServiceUrl(serviceUrl)
59 .Build();
60
61 Assert.Equal(serviceUrl, activity.ServiceUrl);
62 }
63
64 [Fact]
65 public void WithChannelId_SetsChannelId()
66 {
67 CoreActivity activity = new CoreActivityBuilder()
68 .WithChannelId("msteams")
69 .Build();
70
71 Assert.Equal("msteams", activity.ChannelId);
72 }
73
74 [Fact]
75 public void WithType_SetsActivityType()
76 {
77 CoreActivity activity = new CoreActivityBuilder()
78 .WithType(ActivityType.Message)
79 .Build();
80
81 Assert.Equal(ActivityType.Message, activity.Type);
82 }
83
84 [Fact]
85 public void WithText_SetsTextContent_As_Property()
86 {
87 CoreActivity activity = new CoreActivityBuilder()
88 .WithProperty("text", "Hello, World!")
89 .Build();
90
91 Assert.Equal("Hello, World!", activity.Properties["text"]);
92 }
93
94 [Fact]
95 public void WithFrom_SetsSenderAccount()
96 {
97 ConversationAccount fromAccount = new()
98 {
99 Id = "sender-id",
100 Name = "Sender Name"
101 };
102
103 CoreActivity activity = new CoreActivityBuilder()
104 .WithFrom(fromAccount)
105 .Build();
106
107 Assert.Equal("sender-id", activity.From.Id);
108 Assert.Equal("Sender Name", activity.From.Name);
109 }
110
111 [Fact]
112 public void WithRecipient_SetsRecipientAccount()
113 {
114 ConversationAccount recipientAccount = new()
115 {
116 Id = "recipient-id",
117 Name = "Recipient Name"
118 };
119
120 CoreActivity activity = new CoreActivityBuilder()
121 .WithRecipient(recipientAccount)
122 .Build();
123
124 Assert.Equal("recipient-id", activity.Recipient.Id);
125 Assert.Equal("Recipient Name", activity.Recipient.Name);
126 }
127
128 [Fact]
129 public void WithConversation_SetsConversationInfo()
130 {
131 Conversation conversation = new()
132 {
133 Id = "conversation-id"
134 };
135
136 CoreActivity activity = new CoreActivityBuilder()
137 .WithConversation(conversation)
138 .Build();
139
140 Assert.Equal("conversation-id", activity.Conversation.Id);
141 }
142
143 [Fact]
144 public void WithChannelData_SetsChannelData()
145 {
146 ChannelData channelData = new();
147
148 CoreActivity activity = new CoreActivityBuilder()
149 .WithChannelData(channelData)
150 .Build();
151
152 Assert.NotNull(activity.ChannelData);
153 }
154
155 [Fact]
156 public void FluentAPI_CompleteActivity_BuildsCorrectly()
157 {
158 CoreActivity activity = new CoreActivityBuilder()
159 .WithType(ActivityType.Message)
160 .WithId("activity-123")
161 .WithChannelId("msteams")
162 .WithProperty("text", "Test message")
163 .WithServiceUrl(new Uri("https://smba.trafficmanager.net/teams/"))
164 .WithFrom(new ConversationAccount
165 {
166 Id = "sender-id",
167 Name = "Sender"
168 })
169 .WithRecipient(new ConversationAccount
170 {
171 Id = "recipient-id",
172 Name = "Recipient"
173 })
174 .WithConversation(new Conversation
175 {
176 Id = "conv-id"
177 })
178 .Build();
179
180 Assert.Equal(ActivityType.Message, activity.Type);
181 Assert.Equal("activity-123", activity.Id);
182 Assert.Equal("msteams", activity.ChannelId);
183 Assert.Equal("Test message", activity.Properties["text"]?.ToString());
184 Assert.Equal("sender-id", activity.From.Id);
185 Assert.Equal("recipient-id", activity.Recipient.Id);
186 Assert.Equal("conv-id", activity.Conversation.Id);
187 }
188
189 [Fact]
190 public void FluentAPI_MethodChaining_ReturnsBuilderInstance()
191 {
192 CoreActivityBuilder builder = new();
193
194 CoreActivityBuilder result1 = builder.WithId("id");
195 CoreActivityBuilder result2 = builder.WithProperty("text", "text");
196 CoreActivityBuilder result3 = builder.WithType(ActivityType.Message);
197
198 Assert.Same(builder, result1);
199 Assert.Same(builder, result2);
200 Assert.Same(builder, result3);
201 }
202
203 [Fact]
204 public void Build_CalledMultipleTimes_ReturnsSameInstance()
205 {
206 CoreActivityBuilder builder = new CoreActivityBuilder()
207 .WithId("test-id");
208
209 CoreActivity activity1 = builder.Build();
210 CoreActivity activity2 = builder.Build();
211
212 Assert.Same(activity1, activity2);
213 }
214
215 [Fact]
216 public void Builder_ModifyingExistingActivity_PreservesOriginalData()
217 {
218 CoreActivity original = new()
219 {
220 Id = "original-id",
221 Type = ActivityType.Message
222 };
223
224 CoreActivity modified = new CoreActivityBuilder(original)
225 .WithId("other-id")
226 .Build();
227
228 Assert.Equal("other-id", modified.Id);
229 Assert.Equal(ActivityType.Message, modified.Type);
230 }
231
232 [Fact]
233 public void WithConversationReference_WithNullActivity_ThrowsArgumentNullException()
234 {
235 CoreActivityBuilder builder = new();
236
237 Assert.Throws<ArgumentNullException>(() => builder.WithConversationReference(null!));
238 }
239
240 [Fact]
241 public void WithConversationReference_WithNullChannelId_ThrowsArgumentNullException()
242 {
243 CoreActivityBuilder builder = new();
244 CoreActivity sourceActivity = new()
245 {
246 ChannelId = null,
247 ServiceUrl = new Uri("https://test.com"),
248 Conversation = new Conversation(),
249 From = new ConversationAccount(),
250 Recipient = new ConversationAccount()
251 };
252
253 Assert.Throws<ArgumentNullException>(() => builder.WithConversationReference(sourceActivity));
254 }
255
256 [Fact]
257 public void WithConversationReference_WithNullServiceUrl_ThrowsArgumentNullException()
258 {
259 CoreActivityBuilder builder = new();
260 CoreActivity sourceActivity = new()
261 {
262 ChannelId = "msteams",
263 ServiceUrl = null,
264 Conversation = new Conversation(),
265 From = new ConversationAccount(),
266 Recipient = new ConversationAccount()
267 };
268
269 Assert.Throws<ArgumentNullException>(() => builder.WithConversationReference(sourceActivity));
270 }
271
272 [Fact]
273 public void WithConversationReference_WithNullConversation_ThrowsArgumentNullException()
274 {
275 CoreActivityBuilder builder = new();
276 CoreActivity sourceActivity = new()
277 {
278 ChannelId = "msteams",
279 ServiceUrl = new Uri("https://test.com"),
280 Conversation = null!,
281 From = new ConversationAccount(),
282 Recipient = new ConversationAccount()
283 };
284
285 Assert.Throws<ArgumentNullException>(() => builder.WithConversationReference(sourceActivity));
286 }
287
288 [Fact]
289 public void WithConversationReference_WithNullFrom_ThrowsArgumentNullException()
290 {
291 CoreActivityBuilder builder = new();
292 CoreActivity sourceActivity = new()
293 {
294 ChannelId = "msteams",
295 ServiceUrl = new Uri("https://test.com"),
296 Conversation = new Conversation(),
297 From = null!,
298 Recipient = new ConversationAccount()
299 };
300
301 Assert.Throws<ArgumentNullException>(() => builder.WithConversationReference(sourceActivity));
302 }
303
304 [Fact]
305 public void WithConversationReference_WithNullRecipient_ThrowsArgumentNullException()
306 {
307 CoreActivityBuilder builder = new();
308 CoreActivity sourceActivity = new()
309 {
310 ChannelId = "msteams",
311 ServiceUrl = new Uri("https://test.com"),
312 Conversation = new Conversation(),
313 From = new ConversationAccount(),
314 Recipient = null!
315 };
316
317 Assert.Throws<ArgumentNullException>(() => builder.WithConversationReference(sourceActivity));
318 }
319
320 [Fact]
321 public void WithConversationReference_AppliesConversationReference()
322 {
323 CoreActivity sourceActivity = new()
324 {
325 ChannelId = "msteams",
326 ServiceUrl = new Uri("https://smba.trafficmanager.net/teams/"),
327 Conversation = new Conversation { Id = "conv-123" },
328 From = new ConversationAccount { Id = "user-1", Name = "User One" },
329 Recipient = new ConversationAccount { Id = "bot-1", Name = "Bot" }
330 };
331
332 CoreActivity activity = new CoreActivityBuilder()
333 .WithConversationReference(sourceActivity)
334 .Build();
335
336 Assert.Equal("msteams", activity.ChannelId);
337 Assert.Equal(new Uri("https://smba.trafficmanager.net/teams/"), activity.ServiceUrl);
338 Assert.Equal("conv-123", activity.Conversation.Id);
339 Assert.Equal("bot-1", activity.From.Id);
340 Assert.Equal("Bot", activity.From.Name);
341 }
342
343 [Fact]
344 public void WithConversationReference_SwapsFromAndRecipient()
345 {
346 CoreActivity incomingActivity = new()
347 {
348 ChannelId = "msteams",
349 ServiceUrl = new Uri("https://test.com"),
350 Conversation = new Conversation { Id = "conv-123" },
351 From = new ConversationAccount { Id = "user-id", Name = "User" },
352 Recipient = new ConversationAccount { Id = "bot-id", Name = "Bot" }
353 };
354
355 CoreActivity replyActivity = new CoreActivityBuilder()
356 .WithConversationReference(incomingActivity)
357 .Build();
358
359 Assert.Equal("bot-id", replyActivity.From.Id);
360 Assert.Equal("Bot", replyActivity.From.Name);
361 }
362
363 [Fact]
364 public void WithChannelData_WithNullValue_SetsToNull()
365 {
366 CoreActivity activity = new CoreActivityBuilder()
367 .WithChannelData(new ChannelData())
368 .WithChannelData(null)
369 .Build();
370
371 Assert.Null(activity.ChannelData);
372 }
373
374 [Fact]
375 public void WithId_WithEmptyString_SetsEmptyId()
376 {
377 CoreActivity activity = new CoreActivityBuilder()
378 .WithId(string.Empty)
379 .Build();
380
381 Assert.Equal(string.Empty, activity.Id);
382 }
383
384 [Fact]
385 public void WithChannelId_WithEmptyString_SetsEmptyChannelId()
386 {
387 CoreActivity activity = new CoreActivityBuilder()
388 .WithChannelId(string.Empty)
389 .Build();
390
391 Assert.Equal(string.Empty, activity.ChannelId);
392 }
393
394 [Fact]
395 public void WithType_WithEmptyString_SetsEmptyType()
396 {
397 CoreActivity activity = new CoreActivityBuilder()
398 .WithType(string.Empty)
399 .Build();
400
401 Assert.Equal(string.Empty, activity.Type);
402 }
403
404 [Fact]
405 public void WithConversationReference_ChainedWithOtherMethods_MaintainsFluentInterface()
406 {
407 CoreActivity sourceActivity = new()
408 {
409 ChannelId = "msteams",
410 ServiceUrl = new Uri("https://test.com"),
411 Conversation = new Conversation { Id = "conv-123" },
412 From = new ConversationAccount { Id = "user-1" },
413 Recipient = new ConversationAccount { Id = "bot-1" }
414 };
415
416 CoreActivity activity = new CoreActivityBuilder()
417 .WithType(ActivityType.Message)
418 .WithConversationReference(sourceActivity)
419 .Build();
420
421 Assert.Equal(ActivityType.Message, activity.Type);
422 Assert.Equal("bot-1", activity.From.Id);
423 }
424
425 [Fact]
426 public void Build_AfterModificationThenBuild_ReflectsChanges()
427 {
428 CoreActivityBuilder builder = new CoreActivityBuilder()
429 .WithId("id-1");
430
431 CoreActivity activity1 = builder.Build();
432 Assert.Equal("id-1", activity1.Id);
433
434 builder.WithId("id-2");
435 CoreActivity activity2 = builder.Build();
436
437 Assert.Same(activity1, activity2);
438 Assert.Equal("id-2", activity2.Id);
439 }
440
441 [Fact]
442 public void IntegrationTest_CreateComplexActivity()
443 {
444 Uri serviceUrl = new("https://smba.trafficmanager.net/amer/test/");
445 ChannelData channelData = new();
446
447 CoreActivity activity = new CoreActivityBuilder()
448 .WithType(ActivityType.Message)
449 .WithId("msg-001")
450 .WithServiceUrl(serviceUrl)
451 .WithChannelId("msteams")
452 .WithFrom(new ConversationAccount
453 {
454 Id = "bot-id",
455 Name = "Bot"
456 })
457 .WithRecipient(new ConversationAccount
458 {
459 Id = "user-id",
460 Name = "User"
461 })
462 .WithConversation(new Conversation
463 {
464 Id = "conv-001"
465 })
466 .WithChannelData(channelData)
467 .Build();
468
469 Assert.Equal(ActivityType.Message, activity.Type);
470 Assert.Equal("msg-001", activity.Id);
471 Assert.Equal(serviceUrl, activity.ServiceUrl);
472 Assert.Equal("msteams", activity.ChannelId);
473 Assert.Equal("bot-id", activity.From.Id);
474 Assert.Equal("user-id", activity.Recipient.Id);
475 Assert.Equal("conv-001", activity.Conversation.Id);
476 Assert.NotNull(activity.ChannelData);
477 }
478
479 [Fact]
480 public void WithRecipient_DefaultsToNotTargeted()
481 {
482 CoreActivity activity = new CoreActivityBuilder()
483 .WithRecipient(new ConversationAccount { Id = "user-123" })
484 .Build();
485
486 Assert.False(activity.IsTargeted);
487 Assert.NotNull(activity.Recipient);
488 Assert.Equal("user-123", activity.Recipient.Id);
489 }
490
491 [Fact]
492 public void WithRecipient_WithIsTargetedTrue_SetsIsTargeted()
493 {
494 CoreActivity activity = new CoreActivityBuilder()
495 .WithRecipient(new ConversationAccount { Id = "user-123" }, true)
496 .Build();
497
498 Assert.True(activity.IsTargeted);
499 Assert.NotNull(activity.Recipient);
500 Assert.Equal("user-123", activity.Recipient.Id);
501 }
502
503 [Fact]
504 public void WithRecipient_WithIsTargetedFalse_DoesNotSetIsTargeted()
505 {
506 CoreActivity activity = new CoreActivityBuilder()
507 .WithRecipient(new ConversationAccount { Id = "user-123" }, false)
508 .Build();
509
510 Assert.False(activity.IsTargeted);
511 Assert.NotNull(activity.Recipient);
512 Assert.Equal("user-123", activity.Recipient.Id);
513 }
514
515 [Fact]
516 public void WithRecipient_Targeted_MaintainsFluentChaining()
517 {
518 CoreActivityBuilder builder = new();
519
520 CoreActivityBuilder result = builder.WithRecipient(new ConversationAccount { Id = "user-123" }, true);
521
522 Assert.Same(builder, result);
523 }
524
525 [Fact]
526 public void WithRecipient_Targeted_CanChainWithOtherMethods()
527 {
528 CoreActivity activity = new CoreActivityBuilder()
529 .WithType(ActivityType.Message)
530 .WithRecipient(new ConversationAccount { Id = "user-123", Name = "Test User" }, true)
531 .WithChannelId("msteams")
532 .Build();
533
534 Assert.Equal(ActivityType.Message, activity.Type);
535 Assert.True(activity.IsTargeted);
536 Assert.NotNull(activity.Recipient);
537 Assert.Equal("user-123", activity.Recipient.Id);
538 Assert.Equal("Test User", activity.Recipient.Name);
539 Assert.Equal("msteams", activity.ChannelId);
540 }
541}
542