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;
            }
        }
Exemplo n.º 8
0
        /// <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));
        }
Exemplo n.º 9
0
        /// <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);
        }
Exemplo n.º 11
0
        /// <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));
        }
Exemplo n.º 12
0
        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));
        }
Exemplo n.º 14
0
        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);
        }