|
1 | 1 | // Copyright (c) Microsoft Corporation. All rights reserved. |
2 | 2 | // Licensed under the MIT License. |
3 | 3 |
|
| 4 | +using System; |
4 | 5 | using System.Collections.Generic; |
5 | 6 | using System.Linq; |
6 | 7 | using System.Security.Cryptography.X509Certificates; |
| 8 | +using System.Threading.Tasks; |
| 9 | +using Microsoft.Extensions.Logging; |
| 10 | +using Microsoft.Identity.Abstractions; |
7 | 11 | using Microsoft.Identity.Web.Test.Common; |
| 12 | +using Moq; |
8 | 13 | using Xunit; |
9 | 14 |
|
10 | 15 | namespace Microsoft.Identity.Web.Test.Certificates |
@@ -152,5 +157,80 @@ private IEnumerable<CertificateDescription> CreateCertificateDescriptions( |
152 | 157 |
|
153 | 158 | return certificateDescription; |
154 | 159 | } |
| 160 | + |
| 161 | + [Fact] |
| 162 | + public async Task LoadFirstValidCredentialsAsync_ReturnsFirstValidCredential() |
| 163 | + { |
| 164 | + // Arrange |
| 165 | + var loggerMock = new Mock<ILogger<DefaultCredentialsLoader>>(); |
| 166 | + var credentialLoader = new DefaultCredentialsLoader(loggerMock.Object); |
| 167 | + |
| 168 | + var validCredential = new CredentialDescription |
| 169 | + { |
| 170 | + SourceType = CredentialSource.Path, |
| 171 | + ReferenceOrValue = "ValidCredential" |
| 172 | + }; |
| 173 | + var invalidCredential = new CredentialDescription |
| 174 | + { |
| 175 | + SourceType = CredentialSource.Path, |
| 176 | + ReferenceOrValue = "InvalidCredential" |
| 177 | + }; |
| 178 | + |
| 179 | + var credentials = new List<CredentialDescription> { invalidCredential, validCredential }; |
| 180 | + |
| 181 | + var credentialSourceLoaderMock = new Mock<ICredentialSourceLoader>(); |
| 182 | + credentialSourceLoaderMock |
| 183 | + .Setup(loader => loader.LoadIfNeededAsync( |
| 184 | + It.Is<CredentialDescription>(c => c.ReferenceOrValue == "InvalidCredential"), null)) |
| 185 | + .ThrowsAsync(new Exception("Loading failed")); |
| 186 | + credentialSourceLoaderMock |
| 187 | + .Setup(loader => loader.LoadIfNeededAsync( |
| 188 | + It.Is<CredentialDescription>(c => c.ReferenceOrValue == "ValidCredential"), null)) |
| 189 | + .Returns(Task.CompletedTask); |
| 190 | + |
| 191 | + credentialLoader.CredentialSourceLoaders[CredentialSource.Path] = credentialSourceLoaderMock.Object; |
| 192 | + |
| 193 | + // Act |
| 194 | + var result = await credentialLoader.LoadFirstValidCredentialsAsync(credentials); |
| 195 | + |
| 196 | + // Assert |
| 197 | + Assert.NotNull(result); |
| 198 | + Assert.Equal(validCredential, result); |
| 199 | + credentialSourceLoaderMock.Verify( |
| 200 | + loader => loader.LoadIfNeededAsync(invalidCredential, null), Times.Once); |
| 201 | + credentialSourceLoaderMock.Verify( |
| 202 | + loader => loader.LoadIfNeededAsync(validCredential, null), Times.Once); |
| 203 | + } |
| 204 | + |
| 205 | + [Fact] |
| 206 | + public async Task LoadFirstValidCredentialsAsync_LogsWhenCredentialFailsToLoad() |
| 207 | + { |
| 208 | + // Arrange |
| 209 | + var logger = new LoggerFactory().CreateLogger<DefaultCredentialsLoader>(); |
| 210 | + var credentialLoader = new DefaultCredentialsLoader(logger); |
| 211 | + |
| 212 | + var invalidCredential = new CredentialDescription |
| 213 | + { |
| 214 | + SourceType = CredentialSource.Path, |
| 215 | + ReferenceOrValue = "InvalidCredential" |
| 216 | + }; |
| 217 | + var credentials = new List<CredentialDescription> { invalidCredential }; |
| 218 | + |
| 219 | + var credentialSourceLoaderMock = new Mock<ICredentialSourceLoader>(); |
| 220 | + credentialSourceLoaderMock |
| 221 | + .Setup(loader => loader.LoadIfNeededAsync( |
| 222 | + It.Is<CredentialDescription>(c => c.ReferenceOrValue == "InvalidCredential"), null)) |
| 223 | + .ThrowsAsync(new Exception("Loading failed")); |
| 224 | + |
| 225 | + credentialLoader.CredentialSourceLoaders[CredentialSource.Path] = credentialSourceLoaderMock.Object; |
| 226 | + |
| 227 | + // Act |
| 228 | + var result = await credentialLoader.LoadFirstValidCredentialsAsync(credentials); |
| 229 | + |
| 230 | + // Assert |
| 231 | + Assert.Null(result); |
| 232 | + string expectedMessage = $"Failed to load credential: {invalidCredential}. Exception: Loading failed"; |
| 233 | + //Assert.Contains(expectedMessage, logger.LoggedMessages[0], StringComparison.Ordinal); |
| 234 | + } |
155 | 235 | } |
156 | 236 | } |
0 commit comments