public async Task RequestTransitionAsync_CallsSendAsyncWithRequestMessageForSimpleTransition() { const string relativeUri = "api/sausages/1"; var transition = new CrichtonTransition { Uri = relativeUri }; var representorResult = Fixture.Create <CrichtonRepresentor>(); var representorAsJson = Fixture.Create <string>(); var representorBuilder = MockRepository.GenerateMock <IRepresentorBuilder>(); representorBuilder.Stub(r => r.ToRepresentor()).Return(representorResult); serializer.Stub(s => s.ContentType).Return(DefaultMediaType); serializer.Stub( s => s.DeserializeToNewBuilder(Arg <string> .Is.Equal(representorAsJson), Arg <Func <IRepresentorBuilder> > .Matches(m => m().GetType() == typeof(RepresentorBuilder)))) .Return(representorBuilder); var combinedUrl = new Uri(baseUri + relativeUri, UriKind.RelativeOrAbsolute); messageHandler.Condition = m => m.Method == HttpMethod.Get && m.RequestUri == combinedUrl; messageHandler.Response = representorAsJson; messageHandler.ResponseStatusCode = HttpStatusCode.OK; messageHandler.ContentType = DefaultMediaType; var result = await sut.RequestTransitionAsync(transition); Assert.AreEqual(representorResult, result); }
public async Task RequestTransitionAsync_WithNullTransitionUrl() { var transition = new CrichtonTransition { Uri = null }; var representorResult = Fixture.Create <CrichtonRepresentor>(); var representorAsJson = Fixture.Create <string>(); var representorBuilder = MockRepository.GenerateMock <IRepresentorBuilder>(); representorBuilder.Stub(r => r.ToRepresentor()).Return(representorResult); serializer.Stub(s => s.ContentType).Return(DefaultMediaType); serializer.Stub( s => s.DeserializeToNewBuilder(Arg <string> .Is.Equal(representorAsJson), Arg <Func <IRepresentorBuilder> > .Matches(m => m().GetType() == typeof(RepresentorBuilder)))) .Return(representorBuilder); var combinedUrl = baseUri; messageHandler.Condition = m => m.Method == HttpMethod.Get && m.RequestUri == combinedUrl; messageHandler.Response = representorAsJson; messageHandler.ResponseStatusCode = HttpStatusCode.OK; messageHandler.ContentType = DefaultMediaType; var result = await sut.RequestTransitionAsync(transition); Assert.AreEqual(representorResult, result); }
public async Task PostTransitionDataAsJsonAsync_PostsJsonRepresentationOfObject() { var testObject = new { id = 2, name = "bratwurst" }; var testObjectJson = JsonConvert.SerializeObject(testObject); const string relativeUri = "api/sausages"; var transition = new CrichtonTransition { Uri = relativeUri }; var representorResult = Fixture.Create <CrichtonRepresentor>(); var representorAsJson = Fixture.Create <string>(); var representorBuilder = MockRepository.GenerateMock <IRepresentorBuilder>(); representorBuilder.Stub(r => r.ToRepresentor()).Return(representorResult); serializer.Stub(s => s.ContentType).Return(DefaultMediaType); serializer.Stub(s => s.DeserializeToNewBuilder(Arg <string> .Is.Equal(representorAsJson), Arg <Func <IRepresentorBuilder> > .Matches(m => m().GetType() == typeof(RepresentorBuilder)))).Return(representorBuilder); var combinedUrl = new Uri(baseUri + relativeUri, UriKind.RelativeOrAbsolute); messageHandler.Condition = m => m.Method == HttpMethod.Post && m.RequestUri == combinedUrl && m.Content.ReadAsStringAsync().Result == testObjectJson; messageHandler.Response = representorAsJson; messageHandler.ResponseStatusCode = HttpStatusCode.OK; messageHandler.ContentType = DefaultMediaType; var result = await sut.RequestTransitionAsync(transition, testObject); Assert.AreEqual(representorResult, result); }
protected virtual CrichtonTransition GetTransitionFromLinkObject(JToken link, string rel) { var href = link["href"]; var title = link["title"]; var type = link["type"]; var templatedField = link["templated"]; var deprecated = link["deprecation"]; var name = link["name"]; var profile = link["profile"]; var hreflang = link["hreflang"]; var templated = templatedField != null && (bool)templatedField; var transition = new CrichtonTransition { Rel = rel, Uri = (href == null) ? null : href.Value <string>(), Title = (title == null) ? null : title.Value <string>(), Type = (type == null) ? null : type.Value <string>(), UriIsTemplated = templated, DepreciationUri = (deprecated == null) ? null : deprecated.Value <string>(), Name = (name == null) ? null : name.Value <string>(), ProfileUri = (profile == null) ? null : profile.Value <string>(), LanguageTag = (hreflang == null) ? null : hreflang.Value <string>() }; return(transition); }
public async Task RequestTransitionAsync_ThrowsInvalidOperationExceptionIfResponseContentTypeDoesNotMatchSerializer() { const string relativeUri = "api/sausages/1"; const string mediaType2 = "application/vnd.json+banana"; var transition = new CrichtonTransition { Uri = relativeUri }; var representorResult = Fixture.Create <CrichtonRepresentor>(); var representorAsJson = Fixture.Create <string>(); var representorBuilder = MockRepository.GenerateMock <IRepresentorBuilder>(); representorBuilder.Stub(r => r.ToRepresentor()).Return(representorResult); serializer.Stub(s => s.ContentType).Return(DefaultMediaType); serializer.Stub( s => s.DeserializeToNewBuilder(Arg <string> .Is.Equal(representorAsJson), Arg <Func <IRepresentorBuilder> > .Matches(m => m().GetType() == typeof(RepresentorBuilder)))) .Return(representorBuilder); var combinedUrl = new Uri(baseUri + relativeUri, UriKind.RelativeOrAbsolute); messageHandler.Condition = m => m.Method == HttpMethod.Get && m.RequestUri == combinedUrl && m.Headers.Accept.Contains(new MediaTypeWithQualityHeaderValue(DefaultMediaType)); messageHandler.Response = representorAsJson; messageHandler.ResponseStatusCode = HttpStatusCode.OK; messageHandler.ContentType = mediaType2; var result = await sut.RequestTransitionAsync(transition); Assert.AreEqual(representorResult, result); }
public async Task RequestTransitionAsync_WithRelativeUriWhichIsAbsoluteUri() { var absoluteUri = "http://google.com"; var transition = new CrichtonTransition { Uri = absoluteUri }; var representorResult = Fixture.Create <CrichtonRepresentor>(); var representorAsJson = Fixture.Create <string>(); var representorBuilder = MockRepository.GenerateMock <IRepresentorBuilder>(); representorBuilder.Stub(r => r.ToRepresentor()).Return(representorResult); serializer.Stub(s => s.ContentType).Return(DefaultMediaType); serializer.Stub( s => s.DeserializeToNewBuilder(Arg <string> .Is.Equal(representorAsJson), Arg <Func <IRepresentorBuilder> > .Matches(m => m().GetType() == typeof(RepresentorBuilder)))) .Return(representorBuilder); messageHandler.Condition = m => m.Method == HttpMethod.Get && m.RequestUri == new Uri(absoluteUri, UriKind.Absolute); messageHandler.Response = representorAsJson; messageHandler.ResponseStatusCode = HttpStatusCode.OK; messageHandler.ContentType = DefaultMediaType; var result = await sut.RequestTransitionAsync(transition); Assert.AreEqual(representorResult, result); }
private void AddLinkFromTransition(JObject document, CrichtonTransition transition) { if (document["_links"] == null) { document.Add("_links", new JObject()); } var existingRel = document["_links"][transition.Rel]; if (existingRel == null) { var jobject = (JObject)document["_links"]; jobject.Add(transition.Rel, CreateLinkObjectFromTransition(transition)); } else { // we already have a ref. Need to convert this to an array if not already. var array = existingRel as JArray ?? new JArray { existingRel }; array.Add(CreateLinkObjectFromTransition(transition)); // override the existing _links > rel document["_links"][transition.Rel] = array; } }
/// <summary> /// Executes the representor /// </summary> /// <param name="currentRepresentor">the currentRepresentor</param> /// <param name="transitionRequestHandler">the transitionRequestHandler</param> /// <returns>crichton representor</returns> public Task <CrichtonRepresentor> ExecuteAsync(CrichtonRepresentor currentRepresentor, ITransitionRequestHandler transitionRequestHandler) { var transition = new CrichtonTransition() { Uri = Url }; return(transitionRequestHandler.RequestTransitionAsync(transition)); }
/// <summary> /// Requests the transition /// </summary> /// <param name="transition">the transition</param> /// <param name="toSerializeToJson">the object to be posted</param> /// <returns>task including a CrichtonRepresentor</returns> public async Task <CrichtonRepresentor> RequestTransitionAsync(CrichtonTransition transition, object toSerializeToJson = null) { if (transition == null) { throw new ArgumentNullException("transition"); } var requestMessage = new HttpRequestMessage { RequestUri = transition.Uri != null ? new Uri(transition.Uri, UriKind.RelativeOrAbsolute) : null, }; if (toSerializeToJson != null) { requestMessage.Content = new StringContent(JsonConvert.SerializeObject(toSerializeToJson), Encoding.UTF8, "application/json"); } // select HttpMethod based on if there is data to serialize or not requestMessage.Method = toSerializeToJson == null ? HttpMethod.Get : HttpMethod.Post; if (transition.Methods != null && transition.Methods.Any() && ValidHttpMethods.Contains(transition.Methods.First().ToLowerInvariant())) { // an HttpMethod has been specified in the transition. Override it in the request. requestMessage.Method = new HttpMethod(transition.Methods.First().ToUpperInvariant()); } // add Accept header requestMessage.Headers.Accept.ParseAdd(Serializer.ContentType); // run all request filters foreach (var filter in filters) { filter.Execute(requestMessage); } var result = await HttpClient.SendAsync(requestMessage); // will throw HttpRequestException if the request fails result.EnsureSuccessStatusCode(); if (result.Content.Headers.ContentType.MediaType != Serializer.ContentType) { throw new InvalidOperationException(String.Format("Response from {0} was requested with Accept header {1} but the response was {2}.", requestMessage.RequestUri, Serializer.ContentType, result.Content.Headers.ContentType.MediaType)); } var resultContentString = await result.Content.ReadAsStringAsync(); var builder = Serializer.DeserializeToNewBuilder(resultContentString, () => new RepresentorBuilder()); return(builder.ToRepresentor()); }
public async Task RequestTransitionAsync_ThrowsHttpExceptionForNonHttpSuccessCode() { const string relativeUri = "api/sausages/1"; var transition = new CrichtonTransition { Uri = relativeUri }; var combinedUrl = new Uri(baseUri + relativeUri, UriKind.RelativeOrAbsolute); messageHandler.Condition = m => m.Method == HttpMethod.Get && m.RequestUri == combinedUrl; messageHandler.Response = "oh no"; messageHandler.ResponseStatusCode = HttpStatusCode.InternalServerError; await sut.RequestTransitionAsync(transition); }
/// <summary> /// Executes the representor /// </summary> /// <param name="currentRepresentor">the currentRepresentor</param> /// <param name="transitionRequestHandler">the transitionRequestHandler</param> /// <returns>crichton representor</returns> public Task <CrichtonRepresentor> ExecuteAsync(CrichtonRepresentor currentRepresentor, ITransitionRequestHandler transitionRequestHandler) { if (currentRepresentor == null) { throw new ArgumentNullException("currentRepresentor"); } if (transitionRequestHandler == null) { throw new ArgumentNullException("transitionRequestHandler"); } var selfTransition = new CrichtonTransition() { Uri = currentRepresentor.SelfLink }; return(transitionRequestHandler.RequestTransitionAsync(selfTransition)); }
protected override JObject CreateLinkObjectFromTransition(CrichtonTransition transition) { var linkObject = base.CreateLinkObjectFromTransition(transition); if (transition.Methods != null && transition.Methods.Any()) { if (transition.Methods.Count() == 1) { linkObject["method"] = transition.Methods.Single(); } else { linkObject["method"] = new JArray(transition.Methods.ToList()); } } if (transition.MediaTypesAccepted != null && transition.MediaTypesAccepted.Any()) { if (transition.MediaTypesAccepted.Count() == 1) { linkObject["enctype"] = transition.MediaTypesAccepted.Single(); } else { linkObject["enctype"] = new JArray(transition.MediaTypesAccepted.ToList()); } } foreach (var map in RenderMethodMappings.Where(map => transition.RenderMethod == map.Key)) { linkObject["render"] = map.Value; } if (!String.IsNullOrWhiteSpace(transition.Target)) { linkObject["target"] = transition.Target; } AddAttributeesFromAttributesContainerToLinkObject(transition, linkObject); return(linkObject); }
public async Task RequestTransitionAsync_UsesAllTransitionRequestFiltersBeforeSendingRequest() { const string relativeUri = "api/sausages/1"; var transition = new CrichtonTransition { Uri = relativeUri }; var representorResult = Fixture.Create <CrichtonRepresentor>(); var representorAsJson = Fixture.Create <string>(); var representorBuilder = MockRepository.GenerateMock <IRepresentorBuilder>(); representorBuilder.Stub(r => r.ToRepresentor()).Return(representorResult); serializer.Stub(s => s.ContentType).Return(DefaultMediaType); serializer.Stub( s => s.DeserializeToNewBuilder(Arg <string> .Is.Equal(representorAsJson), Arg <Func <IRepresentorBuilder> > .Matches(m => m().GetType() == typeof(RepresentorBuilder)))) .Return(representorBuilder); var requestFilter = MockRepository.GenerateMock <ITransitionRequestFilter>(); var requestFilter2 = MockRepository.GenerateMock <ITransitionRequestFilter>(); sut.AddRequestFilter(requestFilter); sut.AddRequestFilter(requestFilter2); var combinedUrl = new Uri(baseUri + relativeUri, UriKind.RelativeOrAbsolute); messageHandler.Condition = m => m.Method == HttpMethod.Get && m.RequestUri == combinedUrl; messageHandler.Response = representorAsJson; messageHandler.ResponseStatusCode = HttpStatusCode.OK; messageHandler.ContentType = DefaultMediaType; await sut.RequestTransitionAsync(transition); requestFilter.AssertWasCalled(r => r.Execute(Arg <HttpRequestMessage> .Is.Anything)); // get the httprequestmessage that was passed to first filter var message = (HttpRequestMessage)(requestFilter.GetArgumentsForCallsMadeOn(r => r.Execute(Arg <HttpRequestMessage> .Is.Anything))[0][0]); // make sure the second filter was called with the same message as the first requestFilter2.AssertWasCalled(r => r.Execute(message)); }
protected virtual JObject CreateLinkObjectFromTransition(CrichtonTransition transition) { var linkObject = new JObject { { "href", transition.Uri } }; if (!String.IsNullOrWhiteSpace(transition.Title)) { linkObject["title"] = transition.Title; } if (!String.IsNullOrWhiteSpace(transition.Type)) { linkObject["type"] = transition.Type; } if (transition.UriIsTemplated) { linkObject["templated"] = true; } if (!String.IsNullOrWhiteSpace(transition.DepreciationUri)) { linkObject["deprecation"] = transition.DepreciationUri; } if (!String.IsNullOrWhiteSpace(transition.Name)) { linkObject["name"] = transition.Name; } if (!String.IsNullOrWhiteSpace(transition.ProfileUri)) { linkObject["profile"] = transition.ProfileUri; } if (!String.IsNullOrWhiteSpace(transition.LanguageTag)) { linkObject["hreflang"] = transition.LanguageTag; } return(linkObject); }