public void SingleOrDefault_DisposeCalled_OneElementInSequence()
        {
            // Arrange
            var enumerator = new Mock <IEnumerator>(MockBehavior.Strict);

            enumerator.SetupSequence(mock => mock.MoveNext()).Returns(true).Returns(false);
            enumerator.SetupGet(mock => mock.Current).Returns(new Customer());

            var disposable = enumerator.As <IDisposable>();

            disposable.Setup(mock => mock.Dispose()).Verifiable();

            var queryable = new Mock <IQueryable>(MockBehavior.Strict);

            queryable.Setup(mock => mock.GetEnumerator()).Returns(enumerator.Object);

            var actionDescriptor = new ReflectedHttpActionDescriptor
            {
                Configuration        = new HttpConfiguration(),
                MethodInfo           = GetType().GetMethod("SomeAction", BindingFlags.Instance | BindingFlags.NonPublic),
                ControllerDescriptor = new HttpControllerDescriptor {
                    ControllerName = "SomeName"
                }
            };

            // Act
            EnableQueryAttribute.SingleOrDefault(queryable.Object, actionDescriptor);

            // Assert
            disposable.Verify();
        }
        public void SingleOrDefault_IQueryableOfT_ZeroElementsInSequence_ReturnsNull()
        {
            IQueryable <Customer> queryable        = Enumerable.Empty <Customer>().AsQueryable();
            HttpActionDescriptor  actionDescriptor = new Mock <HttpActionDescriptor>().Object;

            var result = EnableQueryAttribute.SingleOrDefault(queryable, actionDescriptor);

            Assert.Null(result);
        }
        public void SingleOrDefault_IQueryableOfT_OneElementInSequence_ReturnsElement()
        {
            Customer customer = new Customer();
            IQueryable <Customer> queryable = new[] { customer }.AsQueryable();
            HttpActionDescriptor  actionDescriptor = new Mock <HttpActionDescriptor>().Object;

            var result = EnableQueryAttribute.SingleOrDefault(queryable, actionDescriptor);

            Assert.Same(customer, result);
        }
        public void SingleOrDefault_IQueryableOfT_MoreThaneOneElementInSequence_Throws()
        {
            IQueryable <Customer>         queryable = new[] { new Customer(), new Customer() }.AsQueryable();
            ReflectedHttpActionDescriptor actionDescriptor = new ReflectedHttpActionDescriptor
            {
                Configuration        = new HttpConfiguration(),
                MethodInfo           = GetType().GetMethod("SomeAction", BindingFlags.Instance | BindingFlags.NonPublic),
                ControllerDescriptor = new HttpControllerDescriptor {
                    ControllerName = "SomeName"
                }
            };

            Assert.Throws <InvalidOperationException>(
                () => EnableQueryAttribute.SingleOrDefault(queryable, actionDescriptor),
                "The action 'SomeAction' on controller 'SomeName' returned a SingleResult containing more than one element. " +
                "SingleResult must have zero or one elements.");
        }