microsoft/teams.net

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
feature/user-agent-header

Branches

Tags

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

Clone

HTTPS

Download ZIP

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

295lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4using System.Text.Json.Nodes;
5using Microsoft.Teams.Bot.Core.Schema;
6using Microsoft.Teams.Bot.Apps.Schema;
7using Microsoft.Teams.Bot.Apps.Schema.MessageActivities;
8
9namespace Microsoft.Teams.Bot.Apps.UnitTests;
10
11public class MessageActivityTests
12{
13 [Fact]
14 public void Constructor_Default_SetsMessageType()
15 {
16 MessageActivity activity = new();
17 Assert.Equal(TeamsActivityType.Message, activity.Type);
18 }
19
20 [Fact]
21 public void Constructor_WithText_SetsTextAndMessageType()
22 {
23 MessageActivity activity = new("Hello World");
24 Assert.Equal(TeamsActivityType.Message, activity.Type);
25 Assert.Equal("Hello World", activity.Text);
26 }
27
28 [Fact]
29 public void DeserializeMessageActivity_WithAllProperties()
30 {
31 MessageActivity activity = MessageActivity.FromJsonString(jsonMessageWithAllProps);
32
33 Assert.Equal(TeamsActivityType.Message, activity.Type);
34 Assert.Equal("Hello World", activity.Text);
35 Assert.Equal("This is a summary", activity.Summary);
36 Assert.Equal("plain", activity.TextFormat);
37 Assert.Equal(InputHints.AcceptingInput, activity.InputHint);
38 Assert.Equal(ImportanceLevels.High, activity.Importance);
39 Assert.Equal(DeliveryModes.Normal, activity.DeliveryMode);
40 Assert.Equal("carousel", activity.AttachmentLayout);
41 Assert.NotNull(activity.Expiration);
42 }
43
44 [Fact]
45 public void MessageActivity_FromCoreActivity_MapsAllProperties()
46 {
47 CoreActivity coreActivity = CoreActivity.FromJsonString(jsonMessageWithAllProps);
48 MessageActivity messageActivity = MessageActivity.FromActivity(coreActivity);
49
50 Assert.Equal("Hello World", messageActivity.Text);
51 Assert.Equal("This is a summary", messageActivity.Summary);
52 Assert.Equal("plain", messageActivity.TextFormat);
53 Assert.Equal(InputHints.AcceptingInput, messageActivity.InputHint);
54 Assert.Equal(ImportanceLevels.High, messageActivity.Importance);
55 Assert.Equal(DeliveryModes.Normal, messageActivity.DeliveryMode);
56 Assert.Equal("carousel", messageActivity.AttachmentLayout);
57 Assert.NotNull(messageActivity.Expiration);
58 }
59
60 [Fact]
61 public void MessageActivity_Serialize_ToJson()
62 {
63 MessageActivity activity = new("Hello World")
64 {
65 Summary = "Test summary",
66 TextFormat = TextFormats.Markdown,
67 InputHint = InputHints.ExpectingInput,
68 Importance = ImportanceLevels.Urgent,
69 DeliveryMode = DeliveryModes.Notification
70 };
71
72 string json = activity.ToJson();
73
74 Assert.Contains("Hello World", json);
75 Assert.Contains("Test summary", json);
76 Assert.Contains("markdown", json);
77 Assert.Contains("expectingInput", json);
78 Assert.Contains("urgent", json);
79 Assert.Contains("notification", json);
80 }
81
82 [Fact]
83 public void MessageActivity_WithAttachments_Deserialize()
84 {
85 MessageActivity activity = MessageActivity.FromJsonString(jsonMessageWithAttachment);
86
87 Assert.Equal("Message with attachment", activity.Text);
88 Assert.NotNull(activity.Attachments);
89 Assert.Single(activity.Attachments);
90 Assert.Equal("application/vnd.microsoft.card.adaptive", activity.Attachments[0].ContentType);
91 }
92
93 [Fact]
94 public void MessageActivity_WithEntities_Deserialize()
95 {
96 MessageActivity activity = MessageActivity.FromJsonString(jsonMessageWithEntities);
97
98 Assert.NotNull(activity.Entities);
99 Assert.Single(activity.Entities);
100 Assert.Equal("mention", activity.Entities[0].Type);
101 }
102
103 [Fact]
104 public void MessageActivity_WithSpeak_SerializeAndDeserialize()
105 {
106 MessageActivity activity = new("Hello")
107 {
108 Speak = "<speak>Hello World</speak>"
109 };
110
111 string json = activity.ToJson();
112 MessageActivity deserialized = MessageActivity.FromJsonString(json);
113 Assert.Equal("<speak>Hello World</speak>", deserialized.Speak);
114 }
115
116 [Fact]
117 public void MessageActivity_WithExpiration_SerializeAndDeserialize()
118 {
119 DateTime expirationDate = new DateTime(2026, 12, 31, 23, 59, 59, DateTimeKind.Utc);
120 MessageActivity activity = new("Expiring message")
121 {
122 Expiration = expirationDate
123 };
124
125 string json = activity.ToJson();
126 MessageActivity deserialized = MessageActivity.FromJsonString(json);
127
128 Assert.NotNull(deserialized.Expiration);
129 Assert.Equal(expirationDate.Year, deserialized.Expiration.Value.Year);
130 Assert.Equal(expirationDate.Month, deserialized.Expiration.Value.Month);
131 Assert.Equal(expirationDate.Day, deserialized.Expiration.Value.Day);
132 }
133
134 [Fact]
135 public void MessageActivity_Constants_InputHints()
136 {
137 MessageActivity activity = new("Test")
138 {
139 InputHint = InputHints.AcceptingInput
140 };
141 Assert.Equal("acceptingInput", activity.InputHint);
142
143 activity.InputHint = InputHints.IgnoringInput;
144 Assert.Equal("ignoringInput", activity.InputHint);
145
146 activity.InputHint = InputHints.ExpectingInput;
147 Assert.Equal("expectingInput", activity.InputHint);
148 }
149
150 [Fact]
151 public void MessageActivity_Constants_TextFormats()
152 {
153 MessageActivity activity = new("Test")
154 {
155 TextFormat = TextFormats.Plain
156 };
157 Assert.Equal("plain", activity.TextFormat);
158
159 activity.TextFormat = TextFormats.Markdown;
160 Assert.Equal("markdown", activity.TextFormat);
161
162 activity.TextFormat = TextFormats.Xml;
163 Assert.Equal("xml", activity.TextFormat);
164 }
165
166 [Fact]
167 public void MessageActivity_FromCoreActivity_WithMissingProperties_HandlesGracefully()
168 {
169 CoreActivity coreActivity = new(ActivityType.Message);
170 MessageActivity messageActivity = MessageActivity.FromActivity(coreActivity);
171
172 Assert.Null(messageActivity.Text);
173 Assert.Null(messageActivity.Speak);
174 Assert.Null(messageActivity.InputHint);
175 Assert.Null(messageActivity.Summary);
176 Assert.Null(messageActivity.TextFormat);
177 Assert.Null(messageActivity.AttachmentLayout);
178 Assert.Null(messageActivity.Importance);
179 Assert.Null(messageActivity.DeliveryMode);
180 Assert.Null(messageActivity.Expiration);
181 }
182
183 [Fact]
184 public void MessageActivity_CopiesTextToProperties()
185 {
186 MessageActivity activity = new("Hello World")
187 {
188 Speak = "Test speak",
189 Summary = "Test summary",
190 TextFormat = TextFormats.Markdown,
191 InputHint = InputHints.AcceptingInput,
192 Importance = ImportanceLevels.High,
193 DeliveryMode = DeliveryModes.Normal,
194 AttachmentLayout = "carousel"
195 };
196
197 Assert.Equal("Hello World", activity.Properties["text"]);
198 Assert.Equal("Test speak", activity.Properties["speak"]);
199 Assert.Equal("Test summary", activity.Properties["summary"]);
200 Assert.Equal(TextFormats.Markdown, activity.Properties["textFormat"]);
201 Assert.Equal(InputHints.AcceptingInput, activity.Properties["inputHint"]);
202 Assert.Equal(ImportanceLevels.High, activity.Properties["importance"]);
203 Assert.Equal(DeliveryModes.Normal, activity.Properties["deliveryMode"]);
204 Assert.Equal("carousel", activity.Properties["attachmentLayout"]);
205 }
206
207
208 [Fact]
209 public void MessageActivity_SerializedAsCoreActivity_IncludesText()
210 {
211 MessageActivity messageActivity = new("Hello World")
212 {
213 Type = ActivityType.Message,
214 ServiceUrl = new Uri("https://test.service.url/")
215 };
216
217 CoreActivity coreActivity = messageActivity;
218 string json = coreActivity.ToJson();
219
220 Assert.Contains("Hello World", json);
221 Assert.Contains("\"text\"", json);
222 }
223
224 private const string jsonMessageWithAllProps = """
225 {
226 "type": "message",
227 "channelId": "msteams",
228 "text": "Hello World",
229 "speak": "<speak>Hello World</speak>",
230 "inputHint": "acceptingInput",
231 "summary": "This is a summary",
232 "textFormat": "plain",
233 "attachmentLayout": "carousel",
234 "importance": "high",
235 "deliveryMode": "normal",
236 "expiration": "2026-12-31T23:59:59Z",
237 "id": "1234567890",
238 "timestamp": "2026-01-21T12:00:00Z",
239 "serviceUrl": "https://smba.trafficmanager.net/amer/",
240 "from": {
241 "id": "user-123",
242 "name": "Test User"
243 },
244 "conversation": {
245 "id": "conversation-123"
246 },
247 "recipient": {
248 "id": "bot-123",
249 "name": "Test Bot"
250 }
251 }
252 """;
253
254 private const string jsonMessageWithAttachment = """
255 {
256 "type": "message",
257 "channelId": "msteams",
258 "text": "Message with attachment",
259 "id": "1234567890",
260 "attachments": [
261 {
262 "contentType": "application/vnd.microsoft.card.adaptive",
263 "content": {
264 "type": "AdaptiveCard",
265 "version": "1.4",
266 "body": [
267 {
268 "type": "TextBlock",
269 "text": "Hello from adaptive card"
270 }
271 ]
272 }
273 }
274 ]
275 }
276 """;
277
278 private const string jsonMessageWithEntities = """
279 {
280 "type": "message",
281 "channelId": "msteams",
282 "text": "<at>TestUser</at> hello",
283 "entities": [
284 {
285 "type": "mention",
286 "mentioned": {
287 "id": "user-123",
288 "name": "TestUser"
289 },
290 "text": "<at>TestUser</at>"
291 }
292 ]
293 }
294 """;
295}
296