microsoft/teams.net

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v2.0.0

Branches

Tags

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

Clone

HTTPS

Download ZIP

Tests/Microsoft.Teams.Apps.Tests/AppTests.cs

217lines · modecode

1using Microsoft.Teams.Api.Auth;
2using Microsoft.Teams.Api.Clients;
3using Microsoft.Teams.Common.Http;
4
5using Moq;
6
7namespace Microsoft.Teams.Apps.Tests;
8
9public class AppTests
10{
11 private readonly string _unexpiredJwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMiwiZXhwIjoxOTE2MjM5MDIyfQ.ZTe6TPjyWE8aMo-RAXX6aO1K5VkpMwyxofRQcndwYjQ";
12 private readonly string _expiredJwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMiwiZXhwIjoxNTE2MjM5MDIzfQ.6dB5kVQtR71r1JDYQqe5Aa1MQoEhCdK4b6ryseopAR0";
13 private readonly string _serviceUrl = "https://test.net/";
14
15 [Fact]
16 public async Task Test_App_Start_GetBotToken_Success()
17 {
18 // arrange
19 var credentials = new Mock<IHttpCredentials>();
20 var options = new AppOptions()
21 {
22 Credentials = credentials.Object,
23 };
24 var app = new App(options);
25 var api = new Mock<ApiClient>(_serviceUrl, CancellationToken.None) { CallBase = true };
26 api.Setup(a => a.Bots.Token.GetAsync(It.IsAny<IHttpCredentials>(), It.IsAny<IHttpClient>()))
27 .ReturnsAsync(new TokenResponse() { AccessToken = _unexpiredJwt, TokenType = "bot" });
28 app.Api = api.Object;
29
30 // act
31 await app.Start();
32
33 // assert
34 api.Verify(api => api.Bots.Token.GetAsync(It.IsAny<IHttpCredentials>(), It.IsAny<IHttpClient>()), Times.Once);
35 Assert.True(app.Token!.ToString() == _unexpiredJwt);
36 }
37
38 [Fact]
39 public async Task Test_App_Start_GetBotToken_Failure()
40 {
41 // arrange
42 var logger = new Mock<Common.Logging.ILogger>();
43 var exception = new Exception("failed to get token");
44 logger.Setup(logger => logger.Error(It.IsAny<string?>(), It.IsAny<Exception>()));
45 var credentials = new Mock<IHttpCredentials>();
46 var options = new AppOptions()
47 {
48 Credentials = credentials.Object,
49 Logger = logger.Object,
50 };
51 var app = new App(options);
52 var api = new Mock<ApiClient>(_serviceUrl, CancellationToken.None) { CallBase = true };
53 api.Setup(a => a.Bots.Token.GetAsync(It.IsAny<IHttpCredentials>(), It.IsAny<IHttpClient>()))
54 .ThrowsAsync(exception);
55 app.Api = api.Object;
56
57 // act
58 await app.Start();
59
60 // assert
61 logger.Verify(logger => logger.Error("Failed to get bot token on app startup.", exception), Times.Once);
62 Assert.Null(app.Token);
63 }
64
65 [Fact]
66 public async Task Test_App_Start_DoesNot_GetBotToken_WhenNoCredentials()
67 {
68 // arrange
69 var options = new AppOptions()
70 {
71 Credentials = null,
72 };
73 var app = new App(options);
74 var api = new Mock<ApiClient>(_serviceUrl, CancellationToken.None) { CallBase = true };
75 api.Setup(a => a.Bots.Token.GetAsync(It.IsAny<IHttpCredentials>(), It.IsAny<IHttpClient>()))
76 .ReturnsAsync(new TokenResponse() { AccessToken = _unexpiredJwt, TokenType = "bot" });
77 app.Api = api.Object;
78
79 // act
80 await app.Start();
81
82 // assert
83 api.Verify(api => api.Bots.Token.GetAsync(It.IsAny<IHttpCredentials>(), It.IsAny<IHttpClient>()), Times.Never);
84 Assert.Null(app.Token);
85 }
86
87 [Fact]
88 public void Test_App_Client_TokenFactory_GetsToken_IfNotExists()
89 {
90 // arrange
91 var client = new Mock<Common.Http.HttpClient>() { CallBase = true };
92 var credentials = new Mock<IHttpCredentials>();
93 var options = new AppOptions()
94 {
95 Client = client.Object,
96 Credentials = credentials.Object,
97 };
98 var app = new App(options);
99 var api = new Mock<ApiClient>(_serviceUrl, CancellationToken.None) { CallBase = true };
100 api.Setup(a => a.Bots.Token.GetAsync(It.IsAny<IHttpCredentials>(), It.IsAny<IHttpClient>()))
101 .ReturnsAsync(new TokenResponse() { AccessToken = _unexpiredJwt, TokenType = "bot" });
102 app.Api = api.Object;
103
104 // act
105 Assert.NotNull(client.Object.Options.TokenFactory);
106 client.Object.Options.TokenFactory();
107
108 // assert
109 api.Verify(api => api.Bots.Token.GetAsync(It.IsAny<IHttpCredentials>(), It.IsAny<IHttpClient>()), Times.Once);
110 Assert.True(app.Token!.ToString() == _unexpiredJwt);
111 }
112
113 [Fact]
114 public void Test_App_Client_TokenFactory_GetsToken_IfExpired()
115 {
116 // arrange
117 var client = new Mock<Common.Http.HttpClient>() { CallBase = true };
118 var credentials = new Mock<IHttpCredentials>();
119 var options = new AppOptions()
120 {
121 Client = client.Object,
122 Credentials = credentials.Object,
123 };
124 var app = new App(options);
125 app.Token = new JsonWebToken(_expiredJwt);
126 credentials.Setup(c => c.Resolve(It.IsAny<IHttpClient>(), It.IsAny<string[]>(), It.IsAny<CancellationToken>()))
127 .ReturnsAsync(new TokenResponse() { AccessToken = _unexpiredJwt, TokenType = "bot" });
128
129 // act
130 Assert.NotNull(client.Object.Options.TokenFactory);
131 client.Object.Options.TokenFactory();
132
133 // assert
134 credentials.Verify(c => c.Resolve(It.IsAny<IHttpClient>(), It.IsAny<string[]>(), It.IsAny<CancellationToken>()), Times.Once);
135 Assert.True(app.Token!.ToString() == _unexpiredJwt);
136 }
137
138 [Fact]
139 public void Test_App_Client_TokenFactory_DoesNotGetToken_IfValid()
140 {
141 // arrange
142 var client = new Mock<Common.Http.HttpClient>() { CallBase = true };
143 var credentials = new Mock<IHttpCredentials>();
144 var options = new AppOptions()
145 {
146 Client = client.Object,
147 Credentials = credentials.Object,
148 };
149 var app = new App(options);
150 app.Token = new JsonWebToken(_unexpiredJwt);
151 credentials.Setup(c => c.Resolve(It.IsAny<IHttpClient>(), It.IsAny<string[]>(), It.IsAny<CancellationToken>()))
152 .ReturnsAsync(new TokenResponse() { AccessToken = _unexpiredJwt, TokenType = "bot" });
153 var api = new Mock<ApiClient>(_serviceUrl, CancellationToken.None) { CallBase = true };
154 api.Setup(a => a.Bots.Token.GetAsync(It.IsAny<IHttpCredentials>(), It.IsAny<IHttpClient>()))
155 .ReturnsAsync(new TokenResponse() { AccessToken = _unexpiredJwt, TokenType = "bot" });
156 app.Api = api.Object;
157
158 // act
159 Assert.NotNull(client.Object.Options.TokenFactory);
160 client.Object.Options.TokenFactory();
161
162 // assert
163 credentials.Verify(c => c.Resolve(It.IsAny<IHttpClient>(), It.IsAny<string[]>(), It.IsAny<CancellationToken>()), Times.Never);
164 api.Verify(api => api.Bots.Token.GetAsync(It.IsAny<IHttpCredentials>(), It.IsAny<IHttpClient>()), Times.Never);
165 }
166
167 [Fact]
168 public void Test_App_Client_TokenFactory_DoesNotGetToken_IfNoCredentials()
169 {
170 // arrange
171 var client = new Mock<Common.Http.HttpClient>() { CallBase = true };
172 var options = new AppOptions()
173 {
174 Client = client.Object,
175 Credentials = null,
176 };
177 var app = new App(options);
178 var api = new Mock<ApiClient>(_serviceUrl, CancellationToken.None) { CallBase = true };
179 api.Setup(a => a.Bots.Token.GetAsync(It.IsAny<IHttpCredentials>(), It.IsAny<IHttpClient>()))
180 .ReturnsAsync(new TokenResponse() { AccessToken = _unexpiredJwt, TokenType = "bot" });
181 app.Api = api.Object;
182
183 // act
184 Assert.NotNull(client.Object.Options.TokenFactory);
185 client.Object.Options.TokenFactory();
186
187 // assert
188 api.Verify(api => api.Bots.Token.GetAsync(It.IsAny<IHttpCredentials>(), It.IsAny<IHttpClient>()), Times.Never);
189 Assert.Null(app.Token);
190 }
191
192 [Fact]
193 public void Test_App_Client_CustomTokenFactory()
194 {
195 // arrange
196 var client = new Mock<Common.Http.HttpClient>() { CallBase = true };
197 var tokenFactoryInvoked = false;
198 IHttpClientOptions.HttpTokenFactory tokenFactory = () =>
199 {
200 tokenFactoryInvoked = true;
201 return null;
202 };
203 client.Object.Options.TokenFactory = tokenFactory;
204 var options = new AppOptions()
205 {
206 Client = client.Object,
207 Credentials = null,
208 };
209 var app = new App(options);
210
211 // act
212 client.Object.Options.TokenFactory();
213
214 // assert
215 Assert.True(tokenFactoryInvoked);
216 }
217}
218