public async Task CachesExistingTokenWhenPossible() { // Arrange var tokenProvider = new Mock <IAccessTokenProvider>(); tokenProvider.Setup(tp => tp.RequestAccessToken()) .Returns(new ValueTask <AccessTokenResult>(new AccessTokenResult(AccessTokenResultStatus.Success, new AccessToken { Expires = DateTime.Now.AddHours(1), GrantedScopes = new string[] { "All" }, Value = "asdf" }, "https://www.example.com"))); var handler = new AuthorizationMessageHandler(tokenProvider.Object, Mock.Of <NavigationManager>()); handler.ConfigureHandler(new[] { "https://localhost:5001" }); var response = new HttpResponseMessage(HttpStatusCode.OK); handler.InnerHandler = new TestMessageHandler(response); // Act _ = await new HttpClient(handler).GetAsync("https://localhost:5001/weather"); response.RequestMessage = null; _ = await new HttpClient(handler).GetAsync("https://localhost:5001/weather"); // Assert Assert.Single(tokenProvider.Invocations); Assert.Equal("asdf", response.RequestMessage.Headers.Authorization.Parameter); }
public async Task UsesCustomScopesAndReturnUrlWhenProvided() { // Arrange var tokenProvider = new Mock <IAccessTokenProvider>(); tokenProvider.Setup(tp => tp.RequestAccessToken(It.IsAny <AccessTokenRequestOptions>())) .Returns(new ValueTask <AccessTokenResult>(new AccessTokenResult(AccessTokenResultStatus.Success, new AccessToken { Expires = DateTime.Now.AddMinutes(3), GrantedScopes = new string[] { "All" }, Value = "asdf" }, "https://www.example.com/return"))); var handler = new AuthorizationMessageHandler(tokenProvider.Object, Mock.Of <NavigationManager>()); handler.ConfigureHandler( new[] { "https://localhost:5001" }, scopes: new[] { "example.read", "example.write" }, returnUrl: "https://www.example.com/return"); var response = new HttpResponseMessage(HttpStatusCode.OK); handler.InnerHandler = new TestMessageHandler(response); // Act _ = await new HttpClient(handler).GetAsync("https://localhost:5001/weather"); // Assert Assert.Equal(1, tokenProvider.Invocations.Count); }
public async Task RequestNewTokenWhenCurrentTokenIsAboutToExpire() { // Arrange var tokenProvider = new Mock <IAccessTokenProvider>(); tokenProvider.Setup(tp => tp.RequestAccessToken()) .Returns(new ValueTask <AccessTokenResult>(new AccessTokenResult(AccessTokenResultStatus.Success, new AccessToken { Expires = DateTime.Now.AddMinutes(3), GrantedScopes = new string[] { "All" }, Value = "asdf" }, "https://www.example.com"))); var handler = new AuthorizationMessageHandler(tokenProvider.Object, Mock.Of <NavigationManager>()); handler.ConfigureHandler(new[] { "https://localhost:5001" }); var response = new HttpResponseMessage(HttpStatusCode.OK); handler.InnerHandler = new TestMessageHandler(response); // Act _ = await new HttpClient(handler).GetAsync("https://localhost:5001/weather"); response.RequestMessage = null; _ = await new HttpClient(handler).GetAsync("https://localhost:5001/weather"); // Assert Assert.Equal(2, tokenProvider.Invocations.Count); }
public async Task Throws_IfTheListOfAllowedUrlsIsNotConfigured() { // Arrange var expectedMessage = "The 'AuthorizationMessageHandler' is not configured. " + "Call 'ConfigureHandler' and provide a list of endpoint urls to attach the token to."; var tokenProvider = new Mock <IAccessTokenProvider>(); var handler = new AuthorizationMessageHandler(tokenProvider.Object, Mock.Of <NavigationManager>()); // Act & Assert var exception = await Assert.ThrowsAsync <InvalidOperationException>( () => new HttpClient(handler).GetAsync("https://www.example.com")); Assert.Equal(expectedMessage, exception.Message); }
public async Task DoesNotAttachTokenToRequest_IfNotPresentInListOfAllowedUrls() { // Arrange var tokenProvider = new Mock <IAccessTokenProvider>(); var handler = new AuthorizationMessageHandler(tokenProvider.Object, Mock.Of <NavigationManager>()); handler.ConfigureHandler(new[] { "https://localhost:5001" }); var response = new HttpResponseMessage(HttpStatusCode.OK); handler.InnerHandler = new TestMessageHandler(response); // Act _ = await new HttpClient(handler).GetAsync("https://www.example.com"); // Assert tokenProvider.VerifyNoOtherCalls(); }
public async Task ThrowsWhenItCanNotProvisionANewToken() { // Arrange var tokenProvider = new Mock <IAccessTokenProvider>(); tokenProvider.Setup(tp => tp.RequestAccessToken()) .Returns(new ValueTask <AccessTokenResult>(new AccessTokenResult(AccessTokenResultStatus.RequiresRedirect, null, "https://www.example.com"))); var handler = new AuthorizationMessageHandler(tokenProvider.Object, Mock.Of <NavigationManager>()); handler.ConfigureHandler(new[] { "https://localhost:5001" }); var response = new HttpResponseMessage(HttpStatusCode.OK); handler.InnerHandler = new TestMessageHandler(response); // Act & assert var exception = await Assert.ThrowsAsync <AccessTokenNotAvailableException>(() => new HttpClient(handler).GetAsync("https://localhost:5001/weather")); }