PageRenderTime 47ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/src/EventStore.Core.Tests/Http/Streams/feed.cs

https://github.com/elainte/EventStore
C# | 435 lines | 374 code | 61 blank | 0 comment | 11 complexity | 1fe1ac36e9c037c62582fa89a65a95ad MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Net;
  4. using System.Xml;
  5. using System.Xml.Linq;
  6. using EventStore.Core.Tests.Helpers;
  7. using EventStore.Core.TransactionLog.Chunks;
  8. using EventStore.Transport.Http;
  9. using NUnit.Framework;
  10. using Newtonsoft.Json.Linq;
  11. using System.Linq;
  12. using HttpStatusCode = System.Net.HttpStatusCode;
  13. namespace EventStore.Core.Tests.Http.Streams
  14. {
  15. namespace feed
  16. {
  17. public abstract class SpecificationWithLongFeed : HttpBehaviorSpecification
  18. {
  19. private int _numberOfEvents;
  20. protected override void Given()
  21. {
  22. _numberOfEvents = 25;
  23. for (var i = 0; i < _numberOfEvents; i++)
  24. {
  25. PostEvent(i);
  26. }
  27. }
  28. protected string PostEvent(int i)
  29. {
  30. var response = MakeArrayEventsPost(
  31. TestStream, new[] {new {EventId = Guid.NewGuid(), EventType = "event-type", Data = new {Number = i}}});
  32. Assert.AreEqual(HttpStatusCode.Created, response.StatusCode);
  33. return response.Headers[HttpResponseHeader.Location];
  34. }
  35. protected string GetLink(JObject feed, string relation)
  36. {
  37. var rel = (from JObject link in feed["links"]
  38. from JProperty attr in link
  39. where attr.Name == "relation" && (string) attr.Value == relation
  40. select link).SingleOrDefault();
  41. return (rel == null) ? (string)null : (string)rel["uri"];
  42. }
  43. }
  44. [TestFixture, Category("LongRunning")]
  45. public class when_posting_multiple_events : SpecificationWithLongFeed
  46. {
  47. protected override void When()
  48. {
  49. GetJson<JObject>(TestStream, ContentType.AtomJson);
  50. }
  51. [Test]
  52. public void returns_ok_status_code()
  53. {
  54. Assert.AreEqual(HttpStatusCode.OK, _lastResponse.StatusCode);
  55. }
  56. }
  57. [TestFixture, Category("LongRunning")]
  58. public class when_retrieving_feed_head : SpecificationWithLongFeed
  59. {
  60. private JObject _feed;
  61. protected override void When()
  62. {
  63. _feed = GetJson<JObject>(TestStream, ContentType.AtomJson);
  64. }
  65. [Test]
  66. public void returns_ok_status_code()
  67. {
  68. Assert.AreEqual(HttpStatusCode.OK, _lastResponse.StatusCode);
  69. }
  70. [Test]
  71. public void contains_a_link_rel_previous()
  72. {
  73. var rel = GetLink(_feed, "previous");
  74. Assert.IsNotEmpty(rel);
  75. }
  76. [Test]
  77. public void contains_a_link_rel_next()
  78. {
  79. var rel = GetLink(_feed, "next");
  80. Assert.IsNotEmpty(rel);
  81. }
  82. [Test]
  83. public void contains_a_link_rel_self()
  84. {
  85. var rel = GetLink(_feed, "self");
  86. Assert.IsNotEmpty(rel);
  87. }
  88. [Test]
  89. public void contains_a_link_rel_first()
  90. {
  91. var rel = GetLink(_feed, "first");
  92. Assert.IsNotEmpty(rel);
  93. }
  94. [Test]
  95. public void contains_a_link_rel_last()
  96. {
  97. var rel = GetLink(_feed, "last");
  98. Assert.IsNotEmpty(rel);
  99. }
  100. }
  101. [TestFixture, Category("LongRunning")]
  102. public class when_retrieving_the_previous_link_of_the_feed_head: SpecificationWithLongFeed
  103. {
  104. private JObject _feed;
  105. private JObject _head;
  106. private string _previous;
  107. protected override void Given()
  108. {
  109. base.Given();
  110. _head = GetJson<JObject>(TestStream, ContentType.AtomJson);
  111. _previous = GetLink(_head, "previous");
  112. }
  113. protected override void When()
  114. {
  115. _feed = GetJson<JObject>(_previous, ContentType.AtomJson);
  116. }
  117. [Test]
  118. public void returns_200_response()
  119. {
  120. Assert.AreEqual(HttpStatusCode.OK, _lastResponse.StatusCode);
  121. }
  122. [Test]
  123. public void there_is_no_prev_link()
  124. {
  125. var rel = GetLink(_feed, "prev");
  126. Assert.IsNull(rel);
  127. }
  128. [Test]
  129. public void there_is_a_next_link()
  130. {
  131. var rel = GetLink(_feed, "next");
  132. Assert.IsNotEmpty(rel);
  133. }
  134. [Test]
  135. public void there_is_a_self_link()
  136. {
  137. var rel = GetLink(_feed, "self");
  138. Assert.IsNotEmpty(rel);
  139. }
  140. [Test]
  141. public void there_is_a_first_link()
  142. {
  143. var rel = GetLink(_feed, "first");
  144. Assert.IsNotEmpty(rel);
  145. }
  146. [Test]
  147. public void there_is_a_last_link()
  148. {
  149. var rel = GetLink(_feed, "last");
  150. Assert.IsNotEmpty(rel);
  151. }
  152. [Test]
  153. public void the_feed_is_empty()
  154. {
  155. Assert.AreEqual(0, _feed["entries"].Count());
  156. }
  157. [Test]
  158. public void the_response_is_not_cachable()
  159. {
  160. Assert.AreEqual("max-age=0, no-cache, must-revalidate", _lastResponse.Headers["Cache-Control"]);
  161. }
  162. }
  163. [TestFixture, Category("LongRunning")]
  164. public class when_reading_a_stream_forward_with_deleted_linktos : HttpSpecificationWithLinkToToDeletedEvents
  165. {
  166. private JObject _feed;
  167. private List<JToken> _entries;
  168. protected override void When()
  169. {
  170. _feed = GetJson<JObject>("/streams/" + LinkedStreamName + "/0/forward/10", accept: ContentType.Json);
  171. _entries = _feed != null ? _feed["entries"].ToList() : new List<JToken>();
  172. }
  173. [Test]
  174. public void the_feed_has_one_event()
  175. {
  176. Assert.AreEqual(1, _entries.Count());
  177. }
  178. [Test]
  179. public void the_edit_link_to_is_to_correct_uri()
  180. {
  181. var foo = _entries[0]["links"][0];
  182. Assert.AreEqual("edit", foo["relation"].ToString());
  183. Assert.AreEqual(MakeUrl("/streams/" + DeletedStreamName + "/0"), foo["uri"].ToString());
  184. }
  185. [Test]
  186. public void the_alt_link_to_is_to_correct_uri()
  187. {
  188. var foo = _entries[0]["links"][1];
  189. Assert.AreEqual("alternate", foo["relation"].ToString());
  190. Assert.AreEqual(MakeUrl("/streams/" + DeletedStreamName + "/0"), foo["uri"].ToString());
  191. }
  192. }
  193. [TestFixture, Category("LongRunning")]
  194. public class when_reading_a_stream_forward_with_maxcount_deleted_linktos : SpecificationWithLinkToToMaxCountDeletedEvents
  195. {
  196. private JObject _feed;
  197. private List<JToken> _entries;
  198. protected override void When()
  199. {
  200. _feed = GetJson<JObject>("/streams/" + LinkedStreamName + "/0/forward/10", accept: ContentType.Json);
  201. _entries = _feed != null ? _feed["entries"].ToList() : new List<JToken>();
  202. }
  203. [Test]
  204. public void the_feed_has_no_events()
  205. {
  206. Assert.AreEqual(1, _entries.Count());
  207. }
  208. }
  209. [TestFixture, Category("LongRunning")][Explicit("Failing test for Greg demonstrating NullReferenceException in Convert.cs")]
  210. public class when_reading_a_stream_forward_with_maxcount_deleted_linktos_with_rich_entry : SpecificationWithLinkToToMaxCountDeletedEvents
  211. {
  212. private JObject _feed;
  213. private List<JToken> _entries;
  214. protected override void When()
  215. {
  216. _feed = GetJson<JObject>("/streams/" + LinkedStreamName + "/0/forward/10?embed=rich", accept: ContentType.Json);
  217. _entries = _feed != null ? _feed["entries"].ToList() : new List<JToken>();
  218. }
  219. [Test]
  220. public void the_feed_has_some_events()
  221. {
  222. Assert.AreEqual(1, _entries.Count());
  223. }
  224. }
  225. [TestFixture, Category("LongRunning")]
  226. public class when_reading_a_stream_forward_with_deleted_linktos_with_content_enabled_as_xml :
  227. HttpSpecificationWithLinkToToDeletedEvents
  228. {
  229. private XDocument _feed;
  230. private XElement[] _entries;
  231. protected override void When()
  232. {
  233. _feed = GetXml("/streams/" + LinkedStreamName + "/0/forward/10?embed=content");
  234. _entries = _feed.GetEntries();
  235. }
  236. [Test]
  237. public void the_feed_has_one_event()
  238. {
  239. Assert.AreEqual(1, _entries.Length);
  240. }
  241. [Test]
  242. public void the_edit_link_is_to_correct_uri()
  243. {
  244. var link = _entries[0].GetLink("edit");
  245. Assert.AreEqual(MakeUrl("/streams/" + DeletedStreamName + "/0"), link);
  246. }
  247. [Test]
  248. public void the_alternate_link_is_to_correct_uri()
  249. {
  250. var link = _entries[0].GetLink("alternate");
  251. Assert.AreEqual(MakeUrl("/streams/" + DeletedStreamName + "/0"), link);
  252. }
  253. }
  254. [TestFixture, Category("LongRunning")]
  255. public class when_reading_a_stream_forward_with_deleted_linktos_with_content_enabled : HttpSpecificationWithLinkToToDeletedEvents
  256. {
  257. private JObject _feed;
  258. private List<JToken> _entries;
  259. protected override void When()
  260. {
  261. _feed = GetJson<JObject>("/streams/" + LinkedStreamName + "/0/forward/10?embed=content", accept: ContentType.Json);
  262. _entries = _feed != null ? _feed["entries"].ToList() : new List<JToken>();
  263. }
  264. [Test]
  265. public void the_feed_has_one_event()
  266. {
  267. Assert.AreEqual(1, _entries.Count());
  268. }
  269. [Test]
  270. public void the_edit_link_to_is_to_correct_uri()
  271. {
  272. var foo = _entries[0]["links"][0];
  273. Assert.AreEqual("edit", foo["relation"].ToString());
  274. Assert.AreEqual(MakeUrl("/streams/" + DeletedStreamName + "/0"), foo["uri"].ToString());
  275. }
  276. [Test]
  277. public void the_alt_link_to_is_to_correct_uri()
  278. {
  279. var foo = _entries[0]["links"][1];
  280. Assert.AreEqual("alternate", foo["relation"].ToString());
  281. Assert.AreEqual(MakeUrl("/streams/" + DeletedStreamName + "/0"), foo["uri"].ToString());
  282. }
  283. }
  284. [TestFixture, Category("LongRunning")]
  285. public class when_reading_a_stream_backward_with_deleted_linktos : HttpSpecificationWithLinkToToDeletedEvents
  286. {
  287. private JObject _feed;
  288. private List<JToken> _entries;
  289. protected override void When()
  290. {
  291. _feed = GetJson<JObject>("/streams/" + LinkedStreamName + "/0/backward/1", accept: ContentType.Json);
  292. _entries = _feed != null? _feed["entries"].ToList() : new List<JToken>();
  293. }
  294. [Test]
  295. public void the_feed_has_one_event()
  296. {
  297. Assert.AreEqual(1, _entries.Count());
  298. }
  299. [Test]
  300. public void the_edit_link_to_is_to_correct_uri()
  301. {
  302. var foo = _entries[0]["links"][0];
  303. Assert.AreEqual("edit", foo["relation"].ToString());
  304. Assert.AreEqual(MakeUrl("/streams/" + DeletedStreamName + "/0"), foo["uri"].ToString());
  305. }
  306. [Test]
  307. public void the_alt_link_to_is_to_correct_uri()
  308. {
  309. var foo = _entries[0]["links"][1];
  310. Assert.AreEqual("alternate", foo["relation"].ToString());
  311. Assert.AreEqual(MakeUrl("/streams/" + DeletedStreamName + "/0"), foo["uri"].ToString());
  312. }
  313. }
  314. [TestFixture, Category("LongRunning")]
  315. public class when_reading_a_stream_backward_with_deleted_linktos_and_embed_of_content : HttpSpecificationWithLinkToToDeletedEvents
  316. {
  317. private JObject _feed;
  318. private List<JToken> _entries;
  319. protected override void When()
  320. {
  321. _feed = GetJson<JObject>("/streams/" + LinkedStreamName + "/0/backward/1", accept: ContentType.Json);
  322. _entries = _feed != null ? _feed["entries"].ToList() : new List<JToken>();
  323. }
  324. [Test]
  325. public void the_feed_has_one_event()
  326. {
  327. Assert.AreEqual(1, _entries.Count());
  328. }
  329. [Test]
  330. public void the_edit_link_to_is_to_correct_uri()
  331. {
  332. var foo = _entries[0]["links"][0];
  333. Assert.AreEqual("edit", foo["relation"].ToString());
  334. Assert.AreEqual(MakeUrl("/streams/" + DeletedStreamName + "/0"), foo["uri"].ToString());
  335. }
  336. [Test]
  337. public void the_alt_link_to_is_to_correct_uri()
  338. {
  339. var foo = _entries[0]["links"][1];
  340. Assert.AreEqual("alternate", foo["relation"].ToString());
  341. Assert.AreEqual(MakeUrl("/streams/" + DeletedStreamName + "/0"), foo["uri"].ToString());
  342. }
  343. }
  344. [TestFixture, Category("LongRunning")]
  345. public class when_polling_the_head_forward_and_a_new_event_appears: SpecificationWithLongFeed
  346. {
  347. private JObject _feed;
  348. private JObject _head;
  349. private string _previous;
  350. private string _lastEventLocation;
  351. protected override void Given()
  352. {
  353. base.Given();
  354. _head = GetJson<JObject>(TestStream, ContentType.AtomJson);
  355. _previous = GetLink(_head, "previous");
  356. _lastEventLocation = PostEvent(-1);
  357. }
  358. protected override void When()
  359. {
  360. _feed = GetJson<JObject>(_previous, ContentType.AtomJson);
  361. }
  362. [Test]
  363. public void returns_ok_status_code()
  364. {
  365. Assert.AreEqual(HttpStatusCode.OK, _lastResponse.StatusCode);
  366. }
  367. [Test]
  368. public void returns_a_feed_with_a_single_entry_referring_to_the_last_event()
  369. {
  370. HelperExtensions.AssertJson(new {entries = new[] {new {Id = _lastEventLocation}}}, _feed);
  371. }
  372. }
  373. }
  374. }