microsoft/teams.net

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
samples/migration-bot

Branches

Tags

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

Clone

HTTPS

Download ZIP

core/test/Microsoft.Teams.Bot.Apps.UnitTests/TeamsActivityBuilderTests.cs

853lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4using Microsoft.Teams.Bot.Apps.Schema;
5using Microsoft.Teams.Bot.Apps.Schema.Entities;
6using Microsoft.Teams.Bot.Core.Schema;
7
8namespace Microsoft.Teams.Bot.Apps.UnitTests;
9
10public class TeamsActivityBuilderTests
11{
12 private readonly TeamsActivityBuilder builder;
13 public TeamsActivityBuilderTests()
14 {
15 builder = TeamsActivity.CreateBuilder();
16 }
17
18 [Fact]
19 public void Constructor_DefaultConstructor_CreatesNewActivity()
20 {
21 TeamsActivity activity = TeamsActivity.CreateBuilder().Build();
22
23 Assert.NotNull(activity);
24 Assert.Null(activity.From);
25 Assert.Null(activity.Recipient);
26 Assert.Null(activity.Conversation);
27 }
28
29 [Fact]
30 public void Constructor_WithExistingActivity_UsesProvidedActivity()
31 {
32 TeamsActivity existingActivity = new()
33 {
34 Id = "test-id"
35 };
36 existingActivity.Properties["text"] = "existing text";
37
38 TeamsActivityBuilder taBuilder = TeamsActivity.CreateBuilder(existingActivity);
39 TeamsActivity activity = taBuilder.Build();
40
41 Assert.Equal("test-id", activity.Id);
42 Assert.Equal("existing text", activity.Properties["text"]);
43 }
44
45 [Fact]
46 public void Constructor_WithNullActivity_ThrowsArgumentNullException()
47 {
48 Assert.Throws<ArgumentNullException>(() => TeamsActivity.CreateBuilder(null!));
49 }
50
51 [Fact]
52 public void WithId_SetsActivityId()
53 {
54 TeamsActivity activity = builder
55 .WithId("test-activity-id")
56 .Build();
57
58 Assert.Equal("test-activity-id", activity.Id);
59 }
60
61 [Fact]
62 public void WithServiceUrl_SetsServiceUrl()
63 {
64 Uri serviceUrl = new("https://smba.trafficmanager.net/teams/");
65
66 TeamsActivity activity = builder
67 .WithServiceUrl(serviceUrl)
68 .Build();
69
70 Assert.Equal(serviceUrl, activity.ServiceUrl);
71 }
72
73 [Fact]
74 public void WithChannelId_SetsChannelId()
75 {
76 TeamsActivity activity = builder
77 .WithChannelId("msteams")
78 .Build();
79
80 Assert.Equal("msteams", activity.ChannelId);
81 }
82
83 [Fact]
84 public void WithType_SetsActivityType()
85 {
86 TeamsActivity activity = builder
87 .WithType(TeamsActivityType.Message)
88 .Build();
89
90 Assert.Equal(TeamsActivityType.Message, activity.Type);
91 }
92
93 [Fact]
94 public void WithText_SetsTextContent()
95 {
96 TeamsActivity activity = builder
97 .WithText("Hello, World!")
98 .Build();
99
100 Assert.Equal("Hello, World!", activity.Properties["text"]);
101 }
102
103 [Fact]
104 public void WithFrom_SetsSenderAccount()
105 {
106 TeamsConversationAccount? fromAccount = TeamsConversationAccount.FromConversationAccount(new ConversationAccount
107 {
108 Id = "sender-id",
109 Name = "Sender Name"
110 });
111
112 TeamsActivity activity = builder
113 .WithFrom(fromAccount)
114 .Build();
115
116 Assert.Equal("sender-id", activity.From?.Id);
117 Assert.Equal("Sender Name", activity.From?.Name);
118 }
119
120 [Fact]
121 public void WithRecipient_SetsRecipientAccount()
122 {
123 TeamsConversationAccount? recipientAccount = TeamsConversationAccount.FromConversationAccount(new ConversationAccount
124 {
125 Id = "recipient-id",
126 Name = "Recipient Name"
127 });
128 Assert.NotNull(recipientAccount);
129 TeamsActivity activity = builder
130 .WithRecipient(recipientAccount)
131 .Build();
132
133 Assert.Equal("recipient-id", activity.Recipient?.Id);
134 Assert.Equal("Recipient Name", activity.Recipient?.Name);
135 }
136
137 [Fact]
138 public void WithConversation_SetsConversationInfo()
139 {
140 Conversation baseConversation = new Conversation("conversation-id");
141
142 Assert.NotNull(baseConversation);
143 baseConversation.Properties.Add("tenantId", "tenant-123");
144 baseConversation.Properties.Add("conversationType", "channel");
145 TeamsConversation? conversation = TeamsConversation.FromConversation(baseConversation);
146
147 TeamsActivity activity = builder
148 .WithConversation(conversation)
149 .Build();
150
151 Assert.Equal("conversation-id", activity.Conversation?.Id);
152 Assert.Equal("tenant-123", activity.Conversation?.TenantId);
153 Assert.Equal("channel", activity.Conversation?.ConversationType);
154 }
155
156 [Fact]
157 public void WithChannelData_SetsChannelData()
158 {
159 TeamsChannelData channelData = new()
160 {
161 TeamsChannelId = "19:channel-id@thread.tacv2",
162 TeamsTeamId = "19:team-id@thread.tacv2"
163 };
164
165 TeamsActivity activity = builder
166 .WithChannelData(channelData)
167 .Build();
168
169 Assert.NotNull(activity.ChannelData);
170 Assert.Equal("19:channel-id@thread.tacv2", activity.ChannelData?.TeamsChannelId);
171 Assert.Equal("19:team-id@thread.tacv2", activity.ChannelData?.TeamsTeamId);
172 }
173
174 [Fact]
175 public void WithEntities_SetsEntitiesCollection()
176 {
177 EntityList entities =
178 [
179 new ClientInfoEntity
180 {
181 Locale = "en-US",
182 Platform = "Web"
183 }
184 ];
185
186 TeamsActivity activity = builder
187 .WithEntities(entities)
188 .Build();
189
190 Assert.NotNull(activity.Entities);
191 Assert.Single(activity.Entities);
192 Assert.IsType<ClientInfoEntity>(activity.Entities[0]);
193 }
194
195 [Fact]
196 public void WithAttachments_SetsAttachmentsCollection()
197 {
198 List<TeamsAttachment> attachments =
199 [
200 new() {
201 ContentType = "application/json",
202 Name = "test-attachment"
203 }
204 ];
205
206 TeamsActivity activity = builder
207 .WithAttachments(attachments)
208 .Build();
209
210 Assert.NotNull(activity.Attachments);
211 Assert.Single(activity.Attachments);
212 Assert.Equal("application/json", activity.Attachments[0].ContentType);
213 Assert.Equal("test-attachment", activity.Attachments[0].Name);
214 }
215
216 [Fact]
217 public void WithAttachment_SetsSingleAttachment()
218 {
219 TeamsAttachment attachment = new()
220 {
221 ContentType = "application/json",
222 Name = "single"
223 };
224
225 TeamsActivity activity = builder
226 .WithAttachment(attachment)
227 .Build();
228
229 Assert.NotNull(activity.Attachments);
230 Assert.Single(activity.Attachments);
231 Assert.Equal("single", activity.Attachments[0].Name);
232 }
233
234 [Fact]
235 public void AddEntity_AddsEntityToCollection()
236 {
237 ClientInfoEntity entity = new()
238 {
239 Locale = "en-US",
240 Country = "US"
241 };
242
243 TeamsActivity activity = builder
244 .AddEntity(entity)
245 .Build();
246
247 Assert.NotNull(activity.Entities);
248 Assert.Single(activity.Entities);
249 Assert.IsType<ClientInfoEntity>(activity.Entities[0]);
250 }
251
252 [Fact]
253 public void AddEntity_MultipleEntities_AddsAllToCollection()
254 {
255 TeamsActivity activity = builder
256 .AddEntity(new ClientInfoEntity { Locale = "en-US" })
257 .AddEntity(new ProductInfoEntity { Id = "product-123" })
258 .Build();
259
260 Assert.NotNull(activity.Entities);
261 Assert.Equal(2, activity.Entities?.Count);
262 }
263
264 [Fact]
265 public void AddAttachment_AddsAttachmentToCollection()
266 {
267 TeamsAttachment attachment = new()
268 {
269 ContentType = "text/html",
270 Name = "test.html"
271 };
272
273 TeamsActivity activity = builder
274 .AddAttachment(attachment)
275 .Build();
276
277 Assert.NotNull(activity.Attachments);
278 Assert.Single(activity.Attachments);
279 Assert.Equal("text/html", activity.Attachments[0].ContentType);
280 }
281
282 [Fact]
283 public void AddAttachment_MultipleAttachments_AddsAllToCollection()
284 {
285 TeamsActivity activity = builder
286 .AddAttachment(new TeamsAttachment { ContentType = "text/html" })
287 .AddAttachment(new TeamsAttachment { ContentType = "application/json" })
288 .Build();
289
290 Assert.NotNull(activity.Attachments);
291 Assert.Equal(2, activity.Attachments?.Count);
292 }
293
294 [Fact]
295 public void AddAdaptiveCardAttachment_AddsAdaptiveCard()
296 {
297 var adaptiveCard = new { type = "AdaptiveCard", version = "1.2" };
298
299 TeamsActivity activity = builder
300 .AddAdaptiveCardAttachment(adaptiveCard)
301 .Build();
302
303 Assert.NotNull(activity.Attachments);
304 Assert.Single(activity.Attachments);
305 Assert.Equal("application/vnd.microsoft.card.adaptive", activity.Attachments[0].ContentType);
306 Assert.Same(adaptiveCard, activity.Attachments[0].Content);
307 }
308
309 [Fact]
310 public void WithAdaptiveCardAttachment_ConfigureActionAppliesChanges()
311 {
312 var adaptiveCard = new { type = "AdaptiveCard" };
313
314 TeamsActivity activity = builder
315 .WithAdaptiveCardAttachment(adaptiveCard, b => b.WithName("feedback"))
316 .Build();
317
318 Assert.NotNull(activity.Attachments);
319 Assert.Single(activity.Attachments);
320 Assert.Equal("feedback", activity.Attachments[0].Name);
321 }
322
323 [Fact]
324 public void AddAdaptiveCardAttachment_WithNullPayload_Throws()
325 {
326 Assert.Throws<ArgumentNullException>(() => builder.AddAdaptiveCardAttachment(null!));
327 }
328
329 [Fact]
330 public void AddMention_WithNullAccount_ThrowsArgumentNullException()
331 {
332 Assert.Throws<ArgumentNullException>(() => builder.AddMention(null!));
333 }
334
335 [Fact]
336 public void AddMention_WithAccountAndDefaultText_AddsMentionAndUpdatesText()
337 {
338 ConversationAccount account = new()
339 {
340 Id = "user-123",
341 Name = "John Doe"
342 };
343
344 TeamsActivity activity = builder
345 .WithText("said hello")
346 .AddMention(account)
347 .Build();
348
349 Assert.Equal("<at>John Doe</at> said hello", activity.Properties["text"]);
350 Assert.NotNull(activity.Entities);
351 Assert.Single(activity.Entities);
352
353 MentionEntity? mention = activity.Entities[0] as MentionEntity;
354 Assert.NotNull(mention);
355 Assert.Equal("user-123", mention.Mentioned?.Id);
356 Assert.Equal("John Doe", mention.Mentioned?.Name);
357 Assert.Equal("<at>John Doe</at>", mention.Text);
358 }
359
360 [Fact]
361 public void AddMention_WithCustomText_UsesCustomText()
362 {
363 ConversationAccount account = new()
364 {
365 Id = "user-123",
366 Name = "John Doe"
367 };
368
369 TeamsActivity activity = builder
370 .WithText("replied")
371 .AddMention(account, "CustomName")
372 .Build();
373
374 Assert.Equal("<at>CustomName</at> replied", activity.Properties["text"]);
375
376 MentionEntity? mention = activity.Entities![0] as MentionEntity;
377 Assert.NotNull(mention);
378 Assert.Equal("<at>CustomName</at>", mention.Text);
379 }
380
381 [Fact]
382 public void AddMention_WithAddTextFalse_DoesNotUpdateText()
383 {
384 ConversationAccount account = new()
385 {
386 Id = "user-123",
387 Name = "John Doe"
388 };
389
390 TeamsActivity activity = builder
391 .WithText("original text")
392 .AddMention(account, addText: false)
393 .Build();
394
395 Assert.Equal("original text", activity.Properties["text"]);
396 Assert.NotNull(activity.Entities);
397 Assert.Single(activity.Entities);
398 }
399
400 [Fact]
401 public void AddMention_MultipleMentions_AddsAllMentions()
402 {
403 ConversationAccount account1 = new() { Id = "user-1", Name = "User One" };
404 ConversationAccount account2 = new() { Id = "user-2", Name = "User Two" };
405
406 TeamsActivity activity = builder
407 .WithText("message")
408 .AddMention(account1)
409 .AddMention(account2)
410 .Build();
411
412 Assert.Equal("<at>User Two</at> <at>User One</at> message", activity.Properties["text"]);
413 Assert.NotNull(activity.Entities);
414 Assert.Equal(2, activity.Entities?.Count);
415 }
416
417 [Fact]
418 public void FluentAPI_CompleteActivity_BuildsCorrectly()
419 {
420 TeamsActivity activity = builder
421 .WithType(TeamsActivityType.Message)
422 .WithId("activity-123")
423 .WithChannelId("msteams")
424 .WithText("Test message")
425 .WithServiceUrl(new Uri("https://smba.trafficmanager.net/teams/"))
426 .WithFrom(TeamsConversationAccount.FromConversationAccount(new ConversationAccount
427 {
428 Id = "sender-id",
429 Name = "Sender"
430 }))
431 .WithRecipient(TeamsConversationAccount.FromConversationAccount(new ConversationAccount
432 {
433 Id = "recipient-id",
434 Name = "Recipient"
435 }))
436 .WithConversation(TeamsConversation.FromConversation(new Conversation
437 {
438 Id = "conv-id"
439 }))
440 .AddEntity(new ClientInfoEntity { Locale = "en-US" })
441 .AddAttachment(new TeamsAttachment { ContentType = "text/html" })
442 .AddMention(new ConversationAccount { Id = "user-1", Name = "User" })
443 .Build();
444
445 Assert.Equal(TeamsActivityType.Message, activity.Type);
446 Assert.Equal("activity-123", activity.Id);
447 Assert.Equal("msteams", activity.ChannelId);
448 Assert.Equal("<at>User</at> Test message", activity.Properties["text"]);
449 Assert.Equal("sender-id", activity.From?.Id);
450 Assert.Equal("recipient-id", activity.Recipient?.Id);
451 Assert.Equal("conv-id", activity.Conversation?.Id);
452 Assert.NotNull(activity.Entities);
453 Assert.Equal(2, activity.Entities?.Count); // ClientInfo + Mention
454 Assert.NotNull(activity.Attachments);
455 Assert.Single(activity.Attachments);
456 }
457
458 [Fact]
459 public void FluentAPI_MethodChaining_ReturnsBuilderInstance()
460 {
461
462 TeamsActivityBuilder result1 = builder.WithId("id");
463 TeamsActivityBuilder result2 = builder.WithText("text");
464 TeamsActivityBuilder result3 = builder.WithType(TeamsActivityType.Message);
465
466 Assert.Same(builder, result1);
467 Assert.Same(builder, result2);
468 Assert.Same(builder, result3);
469 }
470
471 [Fact]
472 public void Build_CalledMultipleTimes_ReturnsSameInstance()
473 {
474 builder
475 .WithId("test-id");
476
477 TeamsActivity activity1 = builder.Build();
478 TeamsActivity activity2 = builder.Build();
479
480 Assert.Same(activity1, activity2);
481 }
482
483 [Fact]
484 public void Builder_ModifyingExistingActivity_PreservesOriginalData()
485 {
486 TeamsActivity original = new()
487 {
488 Id = "original-id",
489 Type = TeamsActivityType.Message
490 };
491 original.Properties["text"] = "original text";
492
493 TeamsActivity modified = TeamsActivity.CreateBuilder(original)
494 .WithText("modified text")
495 .Build();
496
497 Assert.Equal("original-id", modified.Id);
498 Assert.Equal("modified text", modified.Properties["text"]);
499 Assert.Equal(TeamsActivityType.Message, modified.Type);
500 }
501
502 [Fact]
503 public void AddMention_UpdatesBaseEntityCollection()
504 {
505 ConversationAccount account = new()
506 {
507 Id = "user-123",
508 Name = "Test User"
509 };
510
511 TeamsActivity activity = builder
512 .AddMention(account)
513 .Build();
514
515 CoreActivity baseActivity = activity;
516 Assert.NotNull(baseActivity.Entities);
517 Assert.NotEmpty(baseActivity.Entities);
518 }
519
520 [Fact]
521 public void WithChannelData_NullValue_SetsToNull()
522 {
523 TeamsActivity activity = builder
524 .WithChannelData(null!)
525 .Build();
526
527 Assert.Null(activity.ChannelData);
528 }
529
530 [Fact]
531 public void AddEntity_NullEntitiesCollection_InitializesCollection()
532 {
533 TeamsActivity activity = builder.Build();
534
535 Assert.Null(activity.Entities);
536
537 ClientInfoEntity entity = new() { Locale = "en-US" };
538 builder.AddEntity(entity);
539
540 TeamsActivity result = builder.Build();
541 Assert.NotNull(result.Entities);
542 Assert.Single(result.Entities);
543 }
544
545 [Fact]
546 public void AddAttachment_NullAttachmentsCollection_InitializesCollection()
547 {
548 TeamsActivity activity = builder.Build();
549
550 Assert.Null(activity.Attachments);
551
552 TeamsAttachment attachment = new() { ContentType = "text/html" };
553 builder.AddAttachment(attachment);
554
555 TeamsActivity result = builder.Build();
556 Assert.NotNull(result.Attachments);
557 Assert.Single(result.Attachments);
558 }
559
560 [Fact]
561 public void Builder_EmptyText_AddMention_PrependsMention()
562 {
563 ConversationAccount account = new()
564 {
565 Id = "user-123",
566 Name = "User"
567 };
568
569 TeamsActivity activity = builder
570 .AddMention(account)
571 .Build();
572
573 Assert.Equal("<at>User</at> ", activity.Properties["text"]);
574 }
575
576 [Fact]
577 public void WithConversationReference_WithNullActivity_ThrowsArgumentNullException()
578 {
579 Assert.Throws<ArgumentNullException>(() => builder.WithConversationReference(null!));
580 }
581
582 [Fact]
583 public void WithConversationReference_WithNullChannelId_ThrowsArgumentNullException()
584 {
585
586 TeamsActivity sourceActivity = new()
587 {
588 ChannelId = null,
589 ServiceUrl = new Uri("https://test.com"),
590 Conversation = TeamsConversation.FromConversation(new Conversation()),
591 From = TeamsConversationAccount.FromConversationAccount(new ConversationAccount()),
592 Recipient = TeamsConversationAccount.FromConversationAccount(new ConversationAccount())
593 };
594
595 Assert.Throws<ArgumentNullException>(() => builder.WithConversationReference(sourceActivity));
596 }
597
598 [Fact]
599 public void WithConversationReference_WithNullServiceUrl_ThrowsArgumentNullException()
600 {
601 TeamsActivity sourceActivity = new()
602 {
603 ChannelId = "msteams",
604 ServiceUrl = null,
605 Conversation = TeamsConversation.FromConversation(new Conversation()),
606 From = TeamsConversationAccount.FromConversationAccount(new ConversationAccount()),
607 Recipient = TeamsConversationAccount.FromConversationAccount(new ConversationAccount())
608 };
609
610 Assert.Throws<ArgumentNullException>(() => builder.WithConversationReference(sourceActivity));
611 }
612
613 [Fact]
614 public void WithConversationReference_WithEmptyConversationId_DoesNotThrow()
615 {
616 TeamsActivity sourceActivity = new()
617 {
618 ChannelId = "msteams",
619 ServiceUrl = new Uri("https://test.com"),
620 Conversation = TeamsConversation.FromConversation(new Conversation()),
621 From = TeamsConversationAccount.FromConversationAccount(new ConversationAccount { Id = "user-1" }),
622 Recipient = TeamsConversationAccount.FromConversationAccount(new ConversationAccount { Id = "bot-1" })
623 };
624
625 TeamsActivity result = builder.WithConversationReference(sourceActivity).Build();
626
627 Assert.NotNull(result.Conversation);
628 }
629
630 [Fact]
631 public void WithConversationReference_WithEmptyFromId_DoesNotThrow()
632 {
633 TeamsActivity sourceActivity = new()
634 {
635 ChannelId = "msteams",
636 ServiceUrl = new Uri("https://test.com"),
637 Conversation = TeamsConversation.FromConversation(new Conversation { Id = "conv-1" }),
638 From = TeamsConversationAccount.FromConversationAccount(new ConversationAccount()),
639 Recipient = TeamsConversationAccount.FromConversationAccount(new ConversationAccount { Id = "bot-1" })
640 };
641
642 TeamsActivity result = builder.WithConversationReference(sourceActivity).Build();
643
644 Assert.NotNull(result.From);
645 }
646
647 [Fact]
648 public void WithConversationReference_WithEmptyRecipientId_DoesNotThrow()
649 {
650 TeamsActivity sourceActivity = new()
651 {
652 ChannelId = "msteams",
653 ServiceUrl = new Uri("https://test.com"),
654 Conversation = TeamsConversation.FromConversation(new Conversation { Id = "conv-1" }),
655 From = TeamsConversationAccount.FromConversationAccount(new ConversationAccount { Id = "user-1" }),
656 Recipient = TeamsConversationAccount.FromConversationAccount(new ConversationAccount())
657 };
658
659 TeamsActivity result = builder.WithConversationReference(sourceActivity).Build();
660
661 Assert.NotNull(result.From);
662 }
663
664 [Fact]
665 public void WithFrom_WithBaseConversationAccount_ConvertsToTeamsConversationAccount()
666 {
667 ConversationAccount baseAccount = new()
668 {
669 Id = "user-123",
670 Name = "User Name"
671 };
672
673 TeamsActivity activity = builder
674 .WithFrom(baseAccount)
675 .Build();
676
677 Assert.IsType<TeamsConversationAccount>(activity.From);
678 Assert.Equal("user-123", activity.From?.Id);
679 Assert.Equal("User Name", activity.From?.Name);
680 }
681
682 [Fact]
683 public void WithRecipient_WithBaseConversationAccount_ConvertsToTeamsConversationAccount()
684 {
685 ConversationAccount baseAccount = new()
686 {
687 Id = "bot-123",
688 Name = "Bot Name"
689 };
690
691 TeamsActivity activity = builder
692 .WithRecipient(baseAccount)
693 .Build();
694
695 Assert.IsType<TeamsConversationAccount>(activity.Recipient);
696 Assert.Equal("bot-123", activity.Recipient?.Id);
697 Assert.Equal("Bot Name", activity.Recipient?.Name);
698 }
699
700 [Fact]
701 public void WithConversation_WithBaseConversation_ConvertsToTeamsConversation()
702 {
703 Conversation baseConversation = new()
704 {
705 Id = "conv-123"
706 };
707
708 TeamsActivity activity = builder
709 .WithConversation(baseConversation)
710 .Build();
711
712 Assert.IsType<TeamsConversation>(activity.Conversation);
713 Assert.Equal("conv-123", activity.Conversation?.Id);
714 }
715
716 [Fact]
717 public void WithEntities_WithNullValue_SetsToNull()
718 {
719 TeamsActivity activity = builder
720 .WithEntities([new ClientInfoEntity()])
721 .WithEntities(null!)
722 .Build();
723
724 Assert.Null(activity.Entities);
725 }
726
727 [Fact]
728 public void WithAttachments_WithNullValue_SetsToNull()
729 {
730 TeamsActivity activity = builder
731 .WithAttachments([new()])
732 .WithAttachments(null!)
733 .Build();
734
735 Assert.Null(activity.Attachments);
736 }
737
738 [Fact]
739 public void AddMention_WithAccountWithNullName_UsesNullText()
740 {
741 ConversationAccount account = new()
742 {
743 Id = "user-123",
744 Name = null
745 };
746
747 TeamsActivity activity = builder
748 .WithText("message")
749 .AddMention(account)
750 .Build();
751
752 Assert.Equal("<at></at> message", activity.Properties["text"]);
753 Assert.NotNull(activity.Entities);
754 Assert.Single(activity.Entities);
755 }
756
757 [Fact]
758 public void Build_MultipleCalls_ReturnsRebasedActivity()
759 {
760 builder
761 .AddEntity(new ClientInfoEntity { Locale = "en-US" });
762
763 TeamsActivity activity1 = builder.Build();
764 CoreActivity baseActivity1 = activity1;
765 Assert.NotNull(baseActivity1.Entities);
766
767 builder.AddEntity(new ProductInfoEntity { Id = "prod-1" });
768 TeamsActivity activity2 = builder.Build();
769 CoreActivity baseActivity2 = activity2;
770
771 Assert.Same(activity1, activity2);
772 Assert.NotNull(baseActivity2.Entities);
773 Assert.Equal(2, activity2.Entities!.Count);
774 }
775
776 [Fact]
777 public void IntegrationTest_CreateComplexActivity()
778 {
779 Uri serviceUrl = new("https://smba.trafficmanager.net/amer/test/");
780 TeamsChannelData channelData = new()
781 {
782 TeamsChannelId = "19:channel@thread.tacv2",
783 TeamsTeamId = "19:team@thread.tacv2"
784 };
785
786 Conversation conv = new()
787 {
788 Id = "conv-001",
789 Properties =
790 {
791 { "tenantId", "tenant-001" },
792 { "conversationType", "channel" }
793 }
794 };
795
796 TeamsConversation? tc = TeamsConversation.FromConversation(conv);
797 Assert.NotNull(tc);
798
799 TeamsActivity activity = builder
800 .WithType(TeamsActivityType.Message)
801 .WithId("msg-001")
802 .WithServiceUrl(serviceUrl)
803 .WithChannelId("msteams")
804 .WithText("Please review this document")
805 .WithFrom(TeamsConversationAccount.FromConversationAccount(new ConversationAccount
806 {
807 Id = "bot-id",
808 Name = "Bot"
809 }))
810 .WithRecipient(TeamsConversationAccount.FromConversationAccount(new ConversationAccount
811 {
812 Id = "user-id",
813 Name = "User"
814 }))
815 .WithConversation(tc)
816 .WithChannelData(channelData)
817 .AddEntity(new ClientInfoEntity
818 {
819 Locale = "en-US",
820 Country = "US",
821 Platform = "Web"
822 })
823 .AddAttachment(new TeamsAttachment
824 {
825 ContentType = "application/vnd.microsoft.card.adaptive",
826 Name = "adaptive-card.json"
827 })
828 .AddMention(new ConversationAccount
829 {
830 Id = "manager-id",
831 Name = "Manager"
832 }, "Manager")
833 .Build();
834
835 // Verify all properties
836 Assert.Equal(TeamsActivityType.Message, activity.Type);
837 Assert.Equal("msg-001", activity.Id);
838 Assert.Equal(serviceUrl, activity.ServiceUrl);
839 Assert.Equal("msteams", activity.ChannelId);
840 Assert.Equal("<at>Manager</at> Please review this document", activity.Properties["text"]);
841 Assert.Equal("bot-id", activity.From?.Id);
842 Assert.Equal("user-id", activity.Recipient?.Id);
843 Assert.Equal("conv-001", activity.Conversation?.Id);
844 Assert.Equal("tenant-001", activity.Conversation?.TenantId);
845 Assert.Equal("channel", activity.Conversation?.ConversationType);
846 Assert.NotNull(activity.ChannelData);
847 Assert.Equal("19:channel@thread.tacv2", activity.ChannelData?.TeamsChannelId);
848 Assert.NotNull(activity.Entities);
849 Assert.Equal(2, activity.Entities?.Count); // ClientInfo + Mention
850 Assert.NotNull(activity.Attachments);
851 Assert.Single(activity.Attachments);
852 }
853}
854