summaryrefslogtreecommitdiffstats
path: root/src/DotNetOAuth.Test/MessageSerializerTest.cs
blob: 24b7c9cc3cd99b4e81b2f5f980edcfc42efd1889 (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
//-----------------------------------------------------------------------
// <copyright file="MessageSerializerTest.cs" company="Andrew Arnott">
//     Copyright (c) Andrew Arnott. All rights reserved.
// </copyright>
//-----------------------------------------------------------------------

namespace DotNetOAuth.Test {
	using System;
	using System.Collections.Generic;
	using Microsoft.VisualStudio.TestTools.UnitTesting;

	/// <summary>
	/// Tests for the <see cref="MessageSerializer"/> class.
	/// </summary>
	[TestClass()]
	public class MessageSerializerTest : TestBase {
		[TestMethod, ExpectedException(typeof(ArgumentNullException))]
		public void SerializeNull() {
			var serializer = new ProtocolMessageSerializer<Mocks.TestMessage>();
			serializer.Serialize(null);
		}

		[TestMethod, ExpectedException(typeof(ArgumentNullException))]
		public void SerializeNullFields() {
			var serializer = new ProtocolMessageSerializer<Mocks.TestMessage>();
			serializer.Serialize(null, new Mocks.TestMessage());
		}

		[TestMethod, ExpectedException(typeof(ArgumentNullException))]
		public void SerializeNullMessage() {
			var serializer = new ProtocolMessageSerializer<Mocks.TestMessage>();
			serializer.Serialize(new Dictionary<string, string>(), null);
		}

		[TestMethod, ExpectedException(typeof(ProtocolException))]
		public void SerializeInvalidMessage() {
			var serializer = new ProtocolMessageSerializer<Mocks.TestMessage>();
			Dictionary<string, string> fields = new Dictionary<string, string>(StringComparer.Ordinal);
			Mocks.TestMessage message = new DotNetOAuth.Test.Mocks.TestMessage();
			message.EmptyMember = "invalidvalue";
			serializer.Serialize(message);
		}

		[TestMethod()]
		public void SerializeTest() {
			var serializer = new ProtocolMessageSerializer<Mocks.TestMessage>();
			var message = new Mocks.TestMessage { Age = 15, Name = "Andrew", Location = new Uri("http://localhost") };
			IDictionary<string, string> actual = serializer.Serialize(message);
			Assert.AreEqual(3, actual.Count);

			// Test case sensitivity of generated dictionary
			Assert.IsFalse(actual.ContainsKey("Age"));
			Assert.IsTrue(actual.ContainsKey("age"));

			// Test contents of dictionary
			Assert.AreEqual("15", actual["age"]);
			Assert.AreEqual("Andrew", actual["Name"]);
			Assert.AreEqual("http://localhost/", actual["Location"]);
			Assert.IsFalse(actual.ContainsKey("EmptyMember"));
		}

		[TestMethod]
		public void SerializeToExistingDictionary() {
			var serializer = new ProtocolMessageSerializer<Mocks.TestMessage>();
			var message = new Mocks.TestMessage { Age = 15, Name = "Andrew" };
			var fields = new Dictionary<string, string>();
			fields["someExtraField"] = "someValue";
			serializer.Serialize(fields, message);
			Assert.AreEqual(3, fields.Count);
			Assert.AreEqual("15", fields["age"]);
			Assert.AreEqual("Andrew", fields["Name"]);
			Assert.AreEqual("someValue", fields["someExtraField"]);
		}

		[TestMethod, ExpectedException(typeof(ArgumentNullException))]
		public void DeserializeNull() {
			var serializer = new ProtocolMessageSerializer<Mocks.TestMessage>();
			serializer.Deserialize(null);
		}

		[TestMethod()]
		public void DeserializeSimple() {
			var serializer = new ProtocolMessageSerializer<Mocks.TestMessage>();
			Dictionary<string, string> fields = new Dictionary<string, string>(StringComparer.Ordinal);
			// We deliberately do this OUT of alphabetical order (caps would go first),
			// since DataContractSerializer demands things to be IN alphabetical order.
			fields["age"] = "15";
			fields["Name"] = "Andrew";
			var actual = serializer.Deserialize(fields);
			Assert.AreEqual(15, actual.Age);
			Assert.AreEqual("Andrew", actual.Name);
			Assert.IsNull(actual.EmptyMember);
		}

		[TestMethod]
		public void DeserializeWithExtraFields() {
			var serializer = new ProtocolMessageSerializer<Mocks.TestMessage>();
			Dictionary<string, string> fields = new Dictionary<string, string>(StringComparer.Ordinal);
			fields["age"] = "15";
			fields["Name"] = "Andrew";
			// Add some field that is not recognized by the class.  This simulates a querystring with
			// more parameters than are actually interesting to the protocol message.
			fields["someExtraField"] = "asdf";
			var actual = serializer.Deserialize(fields);
			Assert.AreEqual(15, actual.Age);
			Assert.AreEqual("Andrew", actual.Name);
			Assert.IsNull(actual.EmptyMember);
		}

		[TestMethod, ExpectedException(typeof(ProtocolException))]
		public void DeserializeEmpty() {
			var serializer = new ProtocolMessageSerializer<Mocks.TestMessage>();
			var fields = new Dictionary<string, string>(StringComparer.Ordinal);
			serializer.Deserialize(fields);
		}

		[TestMethod, ExpectedException(typeof(ProtocolException))]
		public void DeserializeInvalidMessage() {
			var serializer = new ProtocolMessageSerializer<Mocks.TestMessage>();
			Dictionary<string, string> fields = new Dictionary<string, string>(StringComparer.Ordinal);
			// Set an disallowed value.
			fields["age"] = "-1";
			serializer.Deserialize(fields);
		}
	}
}