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.Core.UnitTests/ConversationClientTests.cs

190lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4using System.Net;
5using Microsoft.Teams.Bot.Core.Schema;
6using Moq;
7using Moq.Protected;
8
9namespace Microsoft.Teams.Bot.Core.UnitTests;
10
11public class ConversationClientTests
12{
13 [Fact]
14 public void ConversationClient_SetsUserAgentHeader()
15 {
16 // Arrange
17 HttpClient httpClient = new();
18
19 // Act
20 ConversationClient conversationClient = new(httpClient);
21
22 // Assert
23 Assert.True(conversationClient.DefaultCustomHeaders.ContainsKey("User-Agent"));
24 var userAgent = conversationClient.DefaultCustomHeaders["User-Agent"];
25 Assert.NotNull(userAgent);
26 Assert.Contains("Microsoft.Teams.Bot.Core", userAgent);
27 Assert.Contains("/", userAgent); // Should have format Name/Version
28 Assert.Matches(@"^[\w\.]+/[\w\.\-\+]+$", userAgent); // Validates RFC 7231 format
29 }
30
31
32 [Fact]
33 public async Task SendActivityAsync_WithValidActivity_SendsSuccessfully()
34 {
35 Mock<HttpMessageHandler> mockHttpMessageHandler = new();
36 mockHttpMessageHandler
37 .Protected()
38 .Setup<Task<HttpResponseMessage>>(
39 "SendAsync",
40 ItExpr.IsAny<HttpRequestMessage>(),
41 ItExpr.IsAny<CancellationToken>())
42 .ReturnsAsync(new HttpResponseMessage
43 {
44 StatusCode = HttpStatusCode.OK,
45 Content = new StringContent("{\"id\":\"activity123\"}")
46 });
47
48 HttpClient httpClient = new(mockHttpMessageHandler.Object);
49 ConversationClient conversationClient = new(httpClient);
50
51 CoreActivity activity = new()
52 {
53 Type = ActivityType.Message,
54 Conversation = new Conversation { Id = "conv123" },
55 ServiceUrl = new Uri("https://test.service.url/")
56 };
57
58 var result = await conversationClient.SendActivityAsync(activity);
59
60 Assert.NotNull(result);
61 Assert.Contains("activity123", result.Id);
62 }
63
64 [Fact]
65 public async Task SendActivityAsync_WithNullActivity_ThrowsArgumentNullException()
66 {
67 HttpClient httpClient = new();
68 ConversationClient conversationClient = new(httpClient);
69
70 await Assert.ThrowsAsync<ArgumentNullException>(() =>
71 conversationClient.SendActivityAsync(null!));
72 }
73
74 [Fact]
75 public async Task SendActivityAsync_WithNullConversation_ThrowsArgumentNullException()
76 {
77 HttpClient httpClient = new();
78 ConversationClient conversationClient = new(httpClient);
79
80 CoreActivity activity = new()
81 {
82 Type = ActivityType.Message,
83 ServiceUrl = new Uri("https://test.service.url/")
84 };
85
86 await Assert.ThrowsAsync<ArgumentException>(() =>
87 conversationClient.SendActivityAsync(activity));
88 }
89
90 [Fact]
91 public async Task SendActivityAsync_WithNullConversationId_ThrowsArgumentNullException()
92 {
93 HttpClient httpClient = new();
94 ConversationClient conversationClient = new(httpClient);
95
96 CoreActivity activity = new()
97 {
98 Type = ActivityType.Message,
99 Conversation = new Conversation() { Id = null! },
100 ServiceUrl = new Uri("https://test.service.url/")
101 }; ;
102
103 await Assert.ThrowsAsync<ArgumentNullException>(() =>
104 conversationClient.SendActivityAsync(activity));
105 }
106
107 [Fact]
108 public async Task SendActivityAsync_WithNullServiceUrl_ThrowsArgumentNullException()
109 {
110 HttpClient httpClient = new();
111 ConversationClient conversationClient = new(httpClient);
112
113 CoreActivity activity = new()
114 {
115 Type = ActivityType.Message,
116 Conversation = new Conversation { Id = "conv123" }
117 };
118
119 await Assert.ThrowsAsync<ArgumentNullException>(() =>
120 conversationClient.SendActivityAsync(activity));
121 }
122
123 [Fact]
124 public async Task SendActivityAsync_WithHttpError_ThrowsHttpRequestException()
125 {
126 Mock<HttpMessageHandler> mockHttpMessageHandler = new();
127 mockHttpMessageHandler
128 .Protected()
129 .Setup<Task<HttpResponseMessage>>(
130 "SendAsync",
131 ItExpr.IsAny<HttpRequestMessage>(),
132 ItExpr.IsAny<CancellationToken>())
133 .ReturnsAsync(new HttpResponseMessage
134 {
135 StatusCode = HttpStatusCode.BadRequest,
136 Content = new StringContent("Bad request error")
137 });
138
139 HttpClient httpClient = new(mockHttpMessageHandler.Object);
140 ConversationClient conversationClient = new(httpClient);
141
142 CoreActivity activity = new()
143 {
144 Type = ActivityType.Message,
145 Conversation = new Conversation { Id = "conv123" },
146 ServiceUrl = new Uri("https://test.service.url/")
147 };
148
149 HttpRequestException exception = await Assert.ThrowsAsync<HttpRequestException>(() =>
150 conversationClient.SendActivityAsync(activity));
151
152 Assert.Contains("Error sending activity", exception.Message);
153 Assert.Contains("BadRequest", exception.Message);
154 }
155
156 [Fact]
157 public async Task SendActivityAsync_ConstructsCorrectUrl()
158 {
159 HttpRequestMessage? capturedRequest = null;
160 Mock<HttpMessageHandler> mockHttpMessageHandler = new();
161 mockHttpMessageHandler
162 .Protected()
163 .Setup<Task<HttpResponseMessage>>(
164 "SendAsync",
165 ItExpr.IsAny<HttpRequestMessage>(),
166 ItExpr.IsAny<CancellationToken>())
167 .Callback<HttpRequestMessage, CancellationToken>((req, ct) => capturedRequest = req)
168 .ReturnsAsync(new HttpResponseMessage
169 {
170 StatusCode = HttpStatusCode.OK,
171 Content = new StringContent("{\"id\":\"activity123\"}")
172 });
173
174 HttpClient httpClient = new(mockHttpMessageHandler.Object);
175 ConversationClient conversationClient = new(httpClient);
176
177 CoreActivity activity = new()
178 {
179 Type = ActivityType.Message,
180 Conversation = new Conversation { Id = "conv123" },
181 ServiceUrl = new Uri("https://test.service.url/")
182 };
183
184 await conversationClient.SendActivityAsync(activity);
185
186 Assert.NotNull(capturedRequest);
187 Assert.Equal("https://test.service.url/v3/conversations/conv123/activities/", capturedRequest.RequestUri?.ToString());
188 Assert.Equal(HttpMethod.Post, capturedRequest.Method);
189 }
190}
191