summaryrefslogtreecommitdiffstats
path: root/src/DotNetOpenAuth.AspNet.Test/OAuth2ClientTest.cs
blob: e979beb9cd77184343f1d91c18f32c0c73006cd8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
namespace DotNetOpenAuth.AspNet.Test {
	using System;
	using System.Collections.Generic;
	using System.Collections.Specialized;
	using System.Web;
	using DotNetOpenAuth.AspNet.Clients;
	using Moq;
	using NUnit.Framework;

	[TestFixture]
	public class OAuth2ClientTest {
		[TestCase]
		public void TestProviderName() {
			// Arrange
			var client = new MockOAuth2Client();

			// Act
			string providerName = client.ProviderName;

			// Assert
			Assert.AreEqual("mockprovider", providerName);
		}

		[TestCase]
		public void RequestAuthenticationIssueCorrectRedirect() {
			// Arrange
			var client = new MockOAuth2Client();
			var context = new Mock<HttpContextBase>(MockBehavior.Strict);
			context.Setup(c => c.Response.Redirect("http://live.com/?q=http://return.to.me/", true)).Verifiable();

			// Act
			client.RequestAuthentication(context.Object, new Uri("http://return.to.me"));

			// Assert
			context.Verify();
		}

		[TestCase]
		public void VerifyAuthenticationThrowsIfContextIsNull() {
			// Arrange
			var client = new MockOAuth2Client();

			// Act && Assert
			Assert.Throws<ArgumentNullException>(() => client.VerifyAuthentication(null));
		}

		[TestCase]
		public void VerifyAuthenticationFailsIfCodeIsNotPresent() {
			// Arrange
			var client = new MockOAuth2Client();
			var context = new Mock<HttpContextBase>(MockBehavior.Strict);
			var queryStrings = new NameValueCollection();
			context.Setup(c => c.Request.QueryString).Returns(queryStrings);

			// Act 
			AuthenticationResult result = client.VerifyAuthentication(context.Object);

			// Assert
			Assert.IsFalse(result.IsSuccessful);
		}

		[TestCase]
		public void VerifyAuthenticationFailsIfAccessTokenIsNull() {
			// Arrange
			var client = new MockOAuth2Client();
			var context = new Mock<HttpContextBase>(MockBehavior.Strict);
			var queryStrings = new NameValueCollection();
			queryStrings.Add("code", "random");
			context.Setup(c => c.Request.QueryString).Returns(queryStrings);

			// Act 
			AuthenticationResult result = client.VerifyAuthentication(context.Object);

			// Assert
			Assert.IsFalse(result.IsSuccessful);
		}

		[TestCase]
		public void VerifyAuthenticationSucceeds() {
			// Arrange
			var client = new MockOAuth2Client();
			var context = new Mock<HttpContextBase>(MockBehavior.Strict);
			var queryStrings = new NameValueCollection();
			queryStrings.Add("code", "secret");
			context.Setup(c => c.Request.QueryString).Returns(queryStrings);

			// Act 
			AuthenticationResult result = client.VerifyAuthentication(context.Object);

			// Assert
			Assert.True(result.IsSuccessful);
			Assert.AreEqual("mockprovider", result.Provider);
			Assert.AreEqual("12345", result.ProviderUserId);
			Assert.AreEqual("John Doe", result.UserName);
			Assert.NotNull(result.ExtraData);
			Assert.AreEqual("abcde", result.ExtraData["accesstoken"]);
		}

		private class MockOAuth2Client : OAuth2Client {
			public MockOAuth2Client()
				: base("mockprovider") {
			}

			protected override Uri GetServiceLoginUrl(Uri returnUrl) {
				string url = "http://live.com/?q=" + returnUrl.ToString();
				return new Uri(url);
			}

			protected override string QueryAccessToken(Uri returnUrl, string authorizationCode) {
				return (authorizationCode == "secret") ? "abcde" : null;
			}

			protected override IDictionary<string, string> GetUserData(string accessToken) {
				if (accessToken == "abcde") {
					return new Dictionary<string, string>
                               {
                                   {"id", "12345"},
                                   {"name", "John Doe"}
                               };
				}

				return null;
			}
		}
	}
}