//----------------------------------------------------------------------- // // Copyright (c) Microsoft. All rights reserved. // //----------------------------------------------------------------------- namespace DotNetOpenAuth.AspNet.Test { using System; using System.Collections.Specialized; using System.Web; using DotNetOpenAuth.AspNet; using DotNetOpenAuth.AspNet.Clients; using DotNetOpenAuth.Messaging; using DotNetOpenAuth.OAuth.Messages; using Moq; using NUnit.Framework; using DotNetOpenAuth.OAuth; using System.Threading; using System.Threading.Tasks; [TestFixture] public class OAuthClientTest { [TestCase] public void TestProviderNamePropertyIsCorrect() { // Arrange var client = new MockOAuthClient(); // Act var provider = client.ProviderName; // Assert Assert.AreEqual("mockoauth", provider); } [TestCase] public async Task RequestAuthenticationInvokeMethodOnWebWorker() { // Arrange var returnUri = new Uri("http://live.com/my/path.cshtml?q=one"); var webWorker = new Mock(MockBehavior.Strict); webWorker .Setup(w => w.RequestAuthenticationAsync(returnUri, It.IsAny())) .Returns(Task.FromResult(new Uri("http://someauth/uri"))) .Verifiable(); var client = new MockOAuthClient(webWorker.Object); var context = new Mock(); // Act await client.RequestAuthenticationAsync(context.Object, returnUri); // Assert webWorker.Verify(); } [TestCase] public async Task VerifyAuthenticationFailsIfResponseTokenIsNull() { // Arrange var webWorker = new Mock(MockBehavior.Strict); webWorker.Setup(w => w.ProcessUserAuthorizationAsync(It.IsAny(), CancellationToken.None)).Returns(Task.FromResult(null)); var client = new MockOAuthClient(webWorker.Object); var context = new Mock(); // Act await client.VerifyAuthenticationAsync(context.Object); // Assert webWorker.Verify(); } [TestCase] public async Task VerifyAuthenticationFailsIfAccessTokenIsInvalid() { // Arrange var endpoint = new MessageReceivingEndpoint("http://live.com/path/?a=b", HttpDeliveryMethods.GetRequest); var request = new AuthorizedTokenRequest(endpoint, new Version("1.0")); var webWorker = new Mock(MockBehavior.Strict); webWorker.Setup(w => w.ProcessUserAuthorizationAsync(It.IsAny(), CancellationToken.None)).Returns(Task.FromResult(null)).Verifiable(); var client = new MockOAuthClient(webWorker.Object); var context = new Mock(); // Act AuthenticationResult result = await client.VerifyAuthenticationAsync(context.Object); // Assert webWorker.Verify(); Assert.False(result.IsSuccessful); } [TestCase] public async Task VerifyAuthenticationSucceeds() { // Arrange var endpoint = new MessageReceivingEndpoint("http://live.com/path/?a=b", HttpDeliveryMethods.GetRequest); var request = new AuthorizedTokenRequest(endpoint, new Version("1.0")); var webWorker = new Mock(MockBehavior.Strict); webWorker .Setup(w => w.ProcessUserAuthorizationAsync(It.IsAny(), CancellationToken.None)) .Returns(Task.FromResult(new AccessTokenResponse("ok", "secret", new NameValueCollection()))).Verifiable(); var client = new MockOAuthClient(webWorker.Object); var context = new Mock(); // Act AuthenticationResult result = await client.VerifyAuthenticationAsync(context.Object); // Assert webWorker.Verify(); Assert.True(result.IsSuccessful); Assert.AreEqual("mockoauth", result.Provider); Assert.AreEqual("12345", result.ProviderUserId); Assert.AreEqual("super", result.UserName); Assert.IsNotNull(result.ExtraData); Assert.AreEqual("ok", result.ExtraData["accesstoken"]); } private class MockOAuthClient : OAuthClient { /// /// Initializes a new instance of the class. /// public MockOAuthClient() : this(new Mock().Object) { } /// /// Initializes a new instance of the class. /// /// The worker. public MockOAuthClient(IOAuthWebWorker worker) : base("mockoauth", worker) { } protected override Task VerifyAuthenticationCoreAsync(AccessTokenResponse response, CancellationToken cancellationToken) { if (response.AccessToken.Token == "ok") { return Task.FromResult(new AuthenticationResult(true, "mockoauth", "12345", "super", response.ExtraData)); } return Task.FromResult(AuthenticationResult.Failed); } } } }