public void ShouldCallResultChooser()
        {
            var filter = new ActAsRestfulie(acceptHeader.Object, contentType.Object, requestInfoFactory.Object,
                                            chooser.Object, resolver.Object);

            filter.GetRequestInfo(actionExecutingContext);
            filter.OnActionExecuted(actionExecutedContext);

            chooser.Verify(c => c.BasedOnMediaType(actionExecutedContext, It.IsAny <IMediaType>(), requestInfo.Object), Times.Once());
        }
        public void ShouldReturnNotAcceptableWhenMediaTypeIsNotSupported()
        {
            acceptHeader.Setup(f => f.GetMediaType(It.IsAny<string>())).Throws(new AcceptHeaderNotSupportedException());
            requestInfo.Setup(ah => ah.GetAcceptHeader()).Returns("some-crazy-media-type");

            var filter = new ActAsRestfulie(acceptHeader.Object, contentType.Object, requestInfoFactory.Object, chooser.Object, resolver.Object);

            filter.OnActionExecuting(actionExecutingContext);

            Assert.IsTrue(actionExecutingContext.Result is NotAcceptable);
        }
        public void ShouldReturnNotAcceptableWhenMediaTypeIsNotSupported()
        {
            acceptHeader.Setup(f => f.GetMediaType(It.IsAny <string>())).Throws(new AcceptHeaderNotSupportedException());
            requestInfo.Setup(ah => ah.GetAcceptHeader()).Returns("some-crazy-media-type");

            var filter = new ActAsRestfulie(acceptHeader.Object, contentType.Object, requestInfoFactory.Object, chooser.Object, resolver.Object);

            filter.OnActionExecuting(actionExecutingContext);

            Assert.IsTrue(actionExecutingContext.Result is NotAcceptable);
        }
        public void ShouldNotReturnUnsupportedMediaTypeWhenContentTypeIsNotInterpretedByResftfulie()
        {
            resolver.Setup(r => r.HasResource).Returns(true);
            contentType.Setup(f => f.GetMediaType(It.IsAny <string>())).Throws(new ContentTypeNotSupportedException());
            requestInfo.Setup(ah => ah.GetContentType()).Returns("some-crazy-media-type");

            var filter = new ActAsRestfulie(acceptHeader.Object, contentType.Object, requestInfoFactory.Object,
                                            chooser.Object, resolver.Object);

            filter.OnActionExecuting(actionExecutingContext);

            Assert.IsFalse(actionExecutingContext.Result is UnsupportedMediaType);
        }
        public void ShouldIgnoreUnmarshallingIfThereIsNothingToBeUnmarshalled()
        {
            resolver.SetupGet(r => r.HasResource).Returns(false);

            contentType.Setup(f => f.GetMediaType(It.IsAny <string>())).Throws(new ContentTypeNotSupportedException());

            var filter = new ActAsRestfulie(acceptHeader.Object, contentType.Object, requestInfoFactory.Object,
                                            chooser.Object, resolver.Object);

            filter.OnActionExecuting(actionExecutingContext);

            contentType.Verify(c => c.GetMediaType(It.IsAny <string>()), Times.Never());
            unmarshaller.Verify(u => u.Build(It.IsAny <string>(), It.IsAny <Type>()), Times.Never());
            unmarshaller.Verify(u => u.Build(It.IsAny <string>(), It.IsAny <Type>()), Times.Never());
        }
        public void ShouldReturnBadRequestWhenUnmarshallingFails()
        {
            resolver.SetupGet(r => r.HasResource).Returns(true);

            unmarshaller.Setup(u => u.Build(It.IsAny <string>(), It.IsAny <Type>())).Throws(
                new UnmarshallingException("message"));

            contentType.Setup(f => f.GetMediaType(It.IsAny <string>())).Returns(mediaType.Object);

            var filter = new ActAsRestfulie(acceptHeader.Object, contentType.Object, requestInfoFactory.Object,
                                            chooser.Object, resolver.Object);

            filter.OnActionExecuting(actionExecutingContext);

            Assert.IsTrue(actionExecutingContext.Result is BadRequest);
        }
        public void ShouldUnmarshallResource()
        {
            var filter = new ActAsRestfulie(acceptHeader.Object, contentType.Object, requestInfoFactory.Object,
                                            chooser.Object, resolver.Object);

            var resource = new SomeResource { Amount = 123, Name = "Some name" };

            resolver.SetupGet(r => r.HasResource).Returns(true);
            resolver.SetupGet(r => r.ParameterName).Returns("Resource");
            resolver.SetupGet(r => r.ParameterType).Returns(typeof (SomeResource));

            unmarshaller.Setup(u => u.Build(It.IsAny<string>(), typeof(SomeResource))).Returns(resource);
            contentType.Setup(m => m.GetMediaType(It.IsAny<string>())).Returns(mediaType.Object);

            filter.OnActionExecuting(actionExecutingContext);

            Assert.AreEqual(resource, actionExecutingContext.ActionParameters["Resource"]);
        }
        public void ShouldNotReplaceResourceIfUnmarshallerReturnsNull()
        {
            var filter = new ActAsRestfulie(acceptHeader.Object, contentType.Object, requestInfoFactory.Object,
                                            chooser.Object, resolver.Object);

            actionExecutingContext.ActionParameters["Resource"] = "some old data here";

            resolver.SetupGet(r => r.HasResource).Returns(true);
            resolver.SetupGet(r => r.ParameterName).Returns("Resource");
            resolver.SetupGet(r => r.ParameterType).Returns(typeof(SomeResource));

            unmarshaller.Setup(u => u.Build(It.IsAny <string>(), typeof(SomeResource))).Returns(null as IBehaveAsResource);
            contentType.Setup(m => m.GetMediaType(It.IsAny <string>())).Returns(mediaType.Object);

            filter.OnActionExecuting(actionExecutingContext);

            Assert.AreEqual("some old data here", actionExecutingContext.ActionParameters["Resource"]);
        }
        public void ShouldUnmarshallListOfResources()
        {
            var filter = new ActAsRestfulie(acceptHeader.Object, contentType.Object, requestInfoFactory.Object,
                                            chooser.Object, resolver.Object);

            var resources = new[] { new SomeResource {
                                        Amount = 123, Name = "Some name"
                                    } };

            resolver.SetupGet(r => r.HasResource).Returns(true);
            resolver.SetupGet(r => r.ParameterName).Returns("Resource");
            resolver.SetupGet(r => r.ParameterType).Returns(typeof(SomeResource));

            unmarshaller.Setup(u => u.Build(It.IsAny <string>(), typeof(SomeResource))).Returns(resources);
            contentType.Setup(m => m.GetMediaType(It.IsAny <string>())).Returns(mediaType.Object);

            filter.OnActionExecuting(actionExecutingContext);

            Assert.AreEqual(resources, actionExecutingContext.ActionParameters["Resource"]);
        }
        public void ShouldCallResultChooser()
        {
            var filter = new ActAsRestfulie(acceptHeader.Object, contentType.Object, requestInfoFactory.Object,
                                chooser.Object, resolver.Object);

            filter.GetRequestInfo(actionExecutingContext);
            filter.OnActionExecuted(actionExecutedContext);

            chooser.Verify(c => c.BasedOnMediaType(actionExecutedContext, It.IsAny<IMediaType>(), requestInfo.Object), Times.Once());
        }
        public void ShouldNotReplaceResourceIfUnmarshallerReturnsNull()
        {
            var filter = new ActAsRestfulie(acceptHeader.Object, contentType.Object, requestInfoFactory.Object,
                                            chooser.Object, resolver.Object);

            actionExecutingContext.ActionParameters["Resource"] = "some old data here";

            resolver.SetupGet(r => r.HasResource).Returns(true);
            resolver.SetupGet(r => r.ParameterName).Returns("Resource");
            resolver.SetupGet(r => r.ParameterType).Returns(typeof(SomeResource));

            unmarshaller.Setup(u => u.Build(It.IsAny<string>(), typeof(SomeResource))).Returns(null as IBehaveAsResource);
            contentType.Setup(m => m.GetMediaType(It.IsAny<string>())).Returns(mediaType.Object);

            filter.OnActionExecuting(actionExecutingContext);

            Assert.AreEqual("some old data here", actionExecutingContext.ActionParameters["Resource"]);
        }
        public void ShouldIgnoreUnmarshallingIfThereIsNothingToBeUnmarshalled()
        {
            resolver.SetupGet(r => r.HasResource).Returns(false);

            contentType.Setup(f => f.GetMediaType(It.IsAny<string>())).Throws(new ContentTypeNotSupportedException());

            var filter = new ActAsRestfulie(acceptHeader.Object, contentType.Object, requestInfoFactory.Object,
                                chooser.Object, resolver.Object);
            filter.OnActionExecuting(actionExecutingContext);

            contentType.Verify(c => c.GetMediaType(It.IsAny<string>()), Times.Never());
            unmarshaller.Verify(u => u.Build(It.IsAny<string>(), It.IsAny<Type>()), Times.Never());
            unmarshaller.Verify(u => u.Build(It.IsAny<string>(), It.IsAny<Type>()), Times.Never());
            
        }
        public void ShouldReturnBadRequestWhenUnmarshallingFails()
        {
            resolver.SetupGet(r => r.HasResource).Returns(true);

            unmarshaller.Setup(u => u.Build(It.IsAny<string>(), It.IsAny<Type>())).Throws(
                new UnmarshallingException("message"));

            contentType.Setup(f => f.GetMediaType(It.IsAny<string>())).Returns(mediaType.Object);

            var filter = new ActAsRestfulie(acceptHeader.Object, contentType.Object, requestInfoFactory.Object,
                                            chooser.Object, resolver.Object);
            filter.OnActionExecuting(actionExecutingContext);

            Assert.IsTrue(actionExecutingContext.Result is BadRequest);
        }
        public void ShouldNotReturnUnsupportedMediaTypeWhenContentTypeIsNotInterpretedByResftfulie()
        {
            resolver.Setup(r => r.HasResource).Returns(true);
            contentType.Setup(f => f.GetMediaType(It.IsAny<string>())).Throws(new ContentTypeNotSupportedException());
            requestInfo.Setup(ah => ah.GetContentType()).Returns("some-crazy-media-type");

            var filter = new ActAsRestfulie(acceptHeader.Object, contentType.Object, requestInfoFactory.Object,
                                            chooser.Object, resolver.Object);

            filter.OnActionExecuting(actionExecutingContext);

            Assert.IsFalse(actionExecutingContext.Result is UnsupportedMediaType);
        }