/MR3/Extensions/OData/tests/Castle.MonoRail.Extension.OData.Tests/SegmentParserTestCase.cs

https://github.com/castleproject/MonoRail · C# · 285 lines · 254 code · 30 blank · 1 comment · 2 complexity · c3bca6ad6cb23223072f91aff37f519c MD5 · raw file

  1. namespace Castle.MonoRail.Extension.OData.Tests
  2. {
  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel.DataAnnotations;
  6. using System.Data.Services.Providers;
  7. using System.Linq;
  8. using System.Web;
  9. using FluentAssertions;
  10. using NUnit.Framework;
  11. [TestFixture]
  12. public class SegmentParserTestCase
  13. {
  14. [Test]
  15. public void ServiceDirectory_()
  16. {
  17. var segments = SegmentParser.parse("/", string.Empty, new StubModel(null));
  18. Asserts.FirstSegmentIsServiceDirectory(segments);
  19. }
  20. [Test]
  21. public void ServiceDirectory_2()
  22. {
  23. var segments = SegmentParser.parse(string.Empty, string.Empty, new StubModel(null));
  24. Asserts.FirstSegmentIsServiceDirectory(segments);
  25. }
  26. [Test]
  27. public void MetadataIdentifier_()
  28. {
  29. var segments = SegmentParser.parse("/$metadata", String.Empty, new StubModel(null));
  30. Asserts.FirstSegmentIsMetadata(segments);
  31. }
  32. [Test]
  33. public void MetadataIdentifier_2()
  34. {
  35. var segments = SegmentParser.parse("/$metadata", String.Empty, new StubModel(null));
  36. Asserts.FirstSegmentIsMetadata(segments);
  37. }
  38. [Test, ExpectedException(typeof(HttpException), ExpectedMessage = "First segment of uri could not be parsed")]
  39. public void AccessingEntity_ThatDoesNotExists_HttpError()
  40. {
  41. SegmentParser.parse("/catalogs", String.Empty, new StubModel(null));
  42. }
  43. [Test]
  44. public void AccessingEntity_()
  45. {
  46. var model = new StubModel(
  47. m => m.EntitySet("catalogs", new List<Catalog1>().AsQueryable())
  48. );
  49. var segments = SegmentParser.parse("/catalogs", String.Empty, model);
  50. Asserts.ExpectingSegmentsCount(segments, 1);
  51. Asserts.IsEntitySet(segments.ElementAt(0), "catalogs", model.GetResourceType("catalogs").Value);
  52. }
  53. [Test]
  54. public void AccessingEntityByKey_()
  55. {
  56. var model = new StubModel(
  57. m => m.EntitySet("catalogs", new List<Catalog1>().AsQueryable())
  58. );
  59. var segments = SegmentParser.parse("/catalogs(1)", String.Empty, model);
  60. Asserts.ExpectingSegmentsCount(segments, 1);
  61. Asserts.IsEntityType(segments.ElementAt(0), Key: "1", Name: "catalogs", resource: model.GetResourceType("catalogs").Value);
  62. }
  63. [Test]
  64. public void AccessingEntityByKey_2()
  65. {
  66. var model = new StubModel(
  67. m => m.EntitySet("catalogs", new List<Catalog1>().AsQueryable())
  68. );
  69. var segments = SegmentParser.parse("/catalogs(10)", String.Empty, model);
  70. Asserts.ExpectingSegmentsCount(segments, 1);
  71. Asserts.IsEntityType(segments.ElementAt(0), Key: "10", Name: "catalogs", resource: model.GetResourceType("catalogs").Value);
  72. }
  73. [Test]
  74. public void AccessingEntityAndProp_()
  75. {
  76. var model = new StubModel(
  77. m => m.EntitySet("catalogs", new List<Catalog1>().AsQueryable())
  78. );
  79. var segments = SegmentParser.parse("/catalogs(1)/Id", String.Empty, model);
  80. Asserts.ExpectingSegmentsCount(segments, 2);
  81. Asserts.IsEntityType(segments.ElementAt(0), Key: "1", Name: "catalogs", resource: model.GetResourceType("catalogs").Value);
  82. Asserts.IsPropertySingle(segments.ElementAt(1), name: "Id");
  83. }
  84. [Test]
  85. public void AccessingEntityAndProp_2()
  86. {
  87. var model = new StubModel(
  88. m => m.EntitySet("catalogs", new List<Catalog1>().AsQueryable())
  89. );
  90. var segments = SegmentParser.parse("/catalogs(1)/Name", String.Empty, model);
  91. Asserts.ExpectingSegmentsCount(segments, 2);
  92. Asserts.IsEntityType(segments.ElementAt(0), Key: "1", Name: "catalogs", resource: model.GetResourceType("catalogs").Value);
  93. Asserts.IsPropertySingle(segments.ElementAt(1), name: "Name");
  94. }
  95. [Test, ExpectedException(typeof(HttpException), ExpectedMessage = "Segment does not match a property or operation")]
  96. public void AccessingEntity_NonExistingProperty()
  97. {
  98. var model = new StubModel(
  99. m => m.EntitySet("catalogs", new List<Catalog1>().AsQueryable())
  100. );
  101. SegmentParser.parse("/catalogs(1)/Something", String.Empty, model);
  102. }
  103. [Test]
  104. public void AccessingEntityAndPropValue_()
  105. {
  106. var model = new StubModel(
  107. m => m.EntitySet("catalogs", new List<Catalog1>().AsQueryable())
  108. );
  109. var segments = SegmentParser.parse("/catalogs(1)/Id/$value", String.Empty, model);
  110. Asserts.ExpectingSegmentsCount(segments, 3);
  111. Asserts.IsEntityType(segments.ElementAt(0), Key: "1", Name: "catalogs", resource: model.GetResourceType("catalogs").Value);
  112. Asserts.IsPropertySingle(segments.ElementAt(1), "Id");
  113. Asserts.IsMeta_Value(segments.ElementAt(2));
  114. }
  115. [Test]
  116. public void AccessingEntityAndPropValue_2()
  117. {
  118. var model = new StubModel(
  119. m => m.EntitySet("catalogs", new List<Catalog1>().AsQueryable())
  120. );
  121. var segments = SegmentParser.parse("/catalogs(1)/Name/$value", String.Empty, model);
  122. Asserts.ExpectingSegmentsCount(segments, 3);
  123. Asserts.IsEntityType(segments.ElementAt(0), Key: "1", Name: "catalogs", resource: model.GetResourceType("catalogs").Value);
  124. Asserts.IsPropertySingle(segments.ElementAt(1), "Name");
  125. Asserts.IsMeta_Value(segments.ElementAt(2));
  126. }
  127. [Test]
  128. public void AccessingEntity_And_OneToManyRelationship_1()
  129. {
  130. var model = new StubModel(
  131. m =>
  132. {
  133. m.EntitySet("catalogs", new List<Catalog2>().AsQueryable());
  134. m.EntitySet("products", new List<Product2>().AsQueryable());
  135. });
  136. var segments = SegmentParser.parse("/catalogs(1)/Products/", String.Empty, model);
  137. Asserts.ExpectingSegmentsCount(segments, 2);
  138. Asserts.IsEntityType(segments.ElementAt(0), Key: "1", Name: "catalogs", resource: model.GetResourceType("catalogs").Value);
  139. // Not sure which one this should be? Products or catalog?
  140. Asserts.IsPropertyCollection(segments.ElementAt(1), Name: "Products", resource: model.GetResourceType("products").Value);
  141. }
  142. [Test]
  143. public void AccessingEntity_And_OneToManyRelationshipWithKey_()
  144. {
  145. var model = new StubModel(
  146. m =>
  147. {
  148. m.EntitySet("catalogs", new List<Catalog2>().AsQueryable());
  149. m.EntitySet("products", new List<Product2>().AsQueryable());
  150. });
  151. var segments = SegmentParser.parse("/catalogs(1)/Products(2)/", String.Empty, model);
  152. Asserts.ExpectingSegmentsCount(segments, 2);
  153. Asserts.IsEntityType(segments.ElementAt(0), Key: "1", Name: "catalogs", resource: model.GetResourceType("catalogs").Value);
  154. Asserts.IsPropertySingle(segments.ElementAt(1), name: "Products", key: "2");
  155. }
  156. [Test]
  157. public void AccessingEntity_And_OneToManyRelationshipWithKey_And_Property()
  158. {
  159. var model = new StubModel(
  160. m =>
  161. {
  162. m.EntitySet("catalogs", new List<Catalog2>().AsQueryable());
  163. m.EntitySet("products", new List<Product2>().AsQueryable());
  164. });
  165. var segments = SegmentParser.parse("/catalogs(1)/Products(2)/Name", String.Empty, model);
  166. Asserts.ExpectingSegmentsCount(segments, 3);
  167. Asserts.IsEntityType(segments.ElementAt(0), Key: "1", Name: "catalogs", resource: model.GetResourceType("catalogs").Value);
  168. Asserts.IsPropertySingle(segments.ElementAt(1), name: "Products", key: "2");
  169. Asserts.IsPropertySingle(segments.ElementAt(2), name: "Name");
  170. }
  171. public class Catalog1
  172. {
  173. [Key]
  174. public int Id { get; set; }
  175. public string Name { get; set; }
  176. }
  177. public class Product2
  178. {
  179. [Key]
  180. public int Id { get; set; }
  181. public string Name { get; set; }
  182. }
  183. public class Catalog2
  184. {
  185. [Key]
  186. public int Id { get; set; }
  187. public string Name { get; set; }
  188. public IList<Product2> Products { get; set; }
  189. }
  190. public static class Asserts
  191. {
  192. public static void FirstSegmentIsServiceDirectory(UriSegment[] segments)
  193. {
  194. ExpectingSegmentsCount(segments, 1);
  195. segments.ElementAt(0).IsServiceDirectory.Should().BeTrue();
  196. }
  197. public static void FirstSegmentIsMetadata(UriSegment[] segments)
  198. {
  199. ExpectingSegmentsCount(segments, 1);
  200. segments.ElementAt(0).IsMeta.Should().BeTrue();
  201. segments.ElementAt(0).As<UriSegment.Meta>().item.IsMetadata.Should().BeTrue();
  202. }
  203. public static void ExpectingSegmentsCount(UriSegment[] segments, int count)
  204. {
  205. segments.Should().NotBeNull();
  206. segments.Should().HaveCount(count);
  207. }
  208. public static void IsEntitySet(UriSegment seg, string Name, ResourceType resource)
  209. {
  210. var segment = seg.As<UriSegment.EntitySet>();
  211. segment.Should().NotBeNull();
  212. segment.item.Key.Should().BeNull();
  213. segment.item.Name.Should().Be(Name);
  214. segment.item.ResourceType.Should().Be(resource);
  215. }
  216. public static void IsEntityType(UriSegment seg, string Key, string Name, ResourceType resource)
  217. {
  218. var segment = seg.As<UriSegment.EntityType>();
  219. segment.Should().NotBeNull();
  220. segment.item.Key.Should().Be(Key);
  221. segment.item.Name.Should().Be(Name);
  222. segment.item.ResourceType.Should().Be(resource);
  223. }
  224. public static void IsPropertySingle(UriSegment elementAt, string name, string key = null)
  225. {
  226. var segment = elementAt.As<UriSegment.PropertyAccessSingle>();
  227. segment.Should().NotBeNull();
  228. segment.item.Property.Name.Should().Be(name);
  229. segment.item.ResourceType.Should().NotBeNull();
  230. if (key == null )
  231. segment.item.Key.Should().BeNull();
  232. else
  233. {
  234. segment.item.Key.Should().NotBeNull();
  235. segment.item.Key.Should().Be(key);
  236. }
  237. }
  238. public static void IsMeta_Value(UriSegment elementAt)
  239. {
  240. var segment = elementAt.As<UriSegment.Meta>();
  241. segment.Should().NotBeNull();
  242. segment.item.IsValue.Should().BeTrue();
  243. }
  244. public static void IsPropertyCollection(UriSegment elementAt, string Name, ResourceType resource)
  245. {
  246. var segment = elementAt.As<UriSegment.PropertyAccessCollection>();
  247. segment.Should().NotBeNull();
  248. segment.item.Property.Name.Should().Be(Name);
  249. segment.item.ResourceType.Should().NotBeNull();
  250. segment.item.ResourceType.Should().Be(resource);
  251. segment.item.Key.Should().BeNull();
  252. }
  253. }
  254. }
  255. }