public async void MemberWithNoOrders_SetsOrderCountTo0()
        {
            Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake();
            SetupVeilDataAccessWithUser(dbStub, memberUser);
            SetupVeilDataAccessWithWebOrders(dbStub, new List<WebOrder>());

            ReportsController controller = new ReportsController(dbStub.Object);

            var result = await controller.MemberList() as ViewResult;

            Assert.That(result != null);
            Assert.That(result.Model, Is.InstanceOf<DateFilteredListViewModel<MemberListItemViewModel>>());

            var model = (DateFilteredListViewModel<MemberListItemViewModel>)result.Model;
            var items = model.Items;

            Assert.That(items.First().OrderCount, Is.EqualTo(0));
        }
        public async void DateFilter_StartAndEndDate_SetsStartDateToMidnight()
        {
            DateTime start = new DateTime(2015, 11, 21);
            DateTime end = new DateTime(2015, 11, 22);

            Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake();
            SetupVeilDataAccessWithUser(dbStub, memberUser, memberUser2);
            SetupVeilDataAccessWithWebOrders(dbStub, new List<WebOrder>());

            ReportsController controller = new ReportsController(dbStub.Object);

            var result = await controller.MemberList(start, end) as ViewResult;

            Assert.That(result != null);
            Assert.That(result.Model, Is.InstanceOf<DateFilteredListViewModel<MemberListItemViewModel>>());

            var model = (DateFilteredListViewModel<MemberListItemViewModel>)result.Model;

            Assert.That(model.StartDate.HasValue);
            Assert.That(model.StartDate.Value, Is.EqualTo(start));
            Assert.That(model.EndDate.HasValue);
        }
        public async void DateFilter_TwoMembersWithSameTotals_ThenOrdersByAverageOrderDescendingOfOrdersInDateRange()
        {
            Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake();
            SetupVeilDataAccessWithUser(dbStub, memberUser, memberUser2);
            SetupVeilDataAccessWithWebOrders(dbStub, new List<WebOrder>
            {
                new WebOrder { MemberId = memberId, OrderSubtotal = 10m, TaxAmount = 10m, ShippingCost = 10m, OrderDate = new DateTime(2015, 11, 22) },
                new WebOrder { MemberId = memberId, OrderSubtotal = 10m, TaxAmount = 10m, ShippingCost = 10m, OrderDate = new DateTime(2010, 01, 01) },
                new WebOrder { MemberId = memberId2, OrderSubtotal = 5m, TaxAmount = 5m, ShippingCost = 5m, OrderDate = new DateTime(2015, 11, 22) },
                new WebOrder { MemberId = memberId2, OrderSubtotal = 5m, TaxAmount = 5m, ShippingCost = 5m, OrderDate = new DateTime(2015, 11, 22) },
                new WebOrder { MemberId = memberId2, OrderSubtotal = 5m, TaxAmount = 5m, ShippingCost = 5m, OrderDate = new DateTime(2010, 01, 01) }
            });

            ReportsController controller = new ReportsController(dbStub.Object);

            var result = await controller.MemberList(start: new DateTime(2015, 11, 22), optionalEnd: new DateTime(2015, 11, 22)) as ViewResult;

            Assert.That(result != null);
            Assert.That(result.Model, Is.InstanceOf<DateFilteredListViewModel<MemberListItemViewModel>>());

            var model = (DateFilteredListViewModel<MemberListItemViewModel>)result.Model;
            var items = model.Items;

            Assert.That(items.First().TotalSpentOnOrders, Is.GreaterThan(0));
            Assert.That(items.First().TotalSpentOnOrders, Is.EqualTo(items.Last().TotalSpentOnOrders));
            Assert.That(items.First().AverageOrderTotal, Is.GreaterThanOrEqualTo(items.Last().AverageOrderTotal));
            Assert.That(items.First().UserName, Is.EqualTo(memberUser.UserName));
            Assert.That(items.Last().UserName, Is.EqualTo(memberUser2.UserName));
        }
        public async void DateFilter_NullEndDate_DefaultsToTodayAtJustBeforeMidnight()
        {
            Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake();
            SetupVeilDataAccessWithUser(dbStub, memberUser, memberUser2);
            SetupVeilDataAccessWithWebOrders(dbStub, new List<WebOrder>());

            ReportsController controller = new ReportsController(dbStub.Object);

            var result = await controller.MemberList(start: new DateTime(2015, 11, 21), optionalEnd: null) as ViewResult;

            Assert.That(result != null);
            Assert.That(result.Model, Is.InstanceOf<DateFilteredListViewModel<MemberListItemViewModel>>());

            var model = (DateFilteredListViewModel<MemberListItemViewModel>)result.Model;

            Assert.That(model.EndDate.HasValue);
            Assert.That(model.EndDate.Value, Is.EqualTo(DateTime.Today.AddDays(1)).Within(1).Seconds);
        }
        public async void DateFilter_MemberWithSomeOrdersInDateRange_SetsCorrectAverageOrderTotal()
        {
            Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake();
            SetupVeilDataAccessWithUser(dbStub, memberUser);
            SetupVeilDataAccessWithWebOrders(dbStub, new List<WebOrder>
            {
                new WebOrder { MemberId = memberId, OrderSubtotal = 1m, TaxAmount = 0m, ShippingCost = 1m, OrderDate = new DateTime(2015, 11, 22) }, /* $2 */
                new WebOrder { MemberId = memberId, OrderSubtotal = 10m, TaxAmount = 10m, ShippingCost = 10m, OrderDate = new DateTime(2010, 01, 01) }, /* $30 */
                new WebOrder { MemberId = memberId, OrderSubtotal = 2m, TaxAmount = 0m, ShippingCost = 2m, OrderDate = new DateTime(2015, 11, 22) }, /* $4 */
                new WebOrder { MemberId = memberId, OrderSubtotal = 10m, TaxAmount = 10m, ShippingCost = 10m, OrderDate = new DateTime(2010, 01, 01) }  /* $30 */
            });

            ReportsController controller = new ReportsController(dbStub.Object);

            var result = await controller.MemberList(start: new DateTime(2015, 11, 22), optionalEnd: new DateTime(2015, 11, 22)) as ViewResult;

            Assert.That(result != null);
            Assert.That(result.Model, Is.InstanceOf<DateFilteredListViewModel<MemberListItemViewModel>>());

            var model = (DateFilteredListViewModel<MemberListItemViewModel>)result.Model;
            var items = model.Items;

            Assert.That(items.First().AverageOrderTotal, Is.EqualTo(3m));
        }
        public async void DateFilter_MemberWithOrders_SetsCorrectTotalSpentOnOrders()
        {
            Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake();
            SetupVeilDataAccessWithUser(dbStub, memberUser);
            SetupVeilDataAccessWithWebOrders(dbStub, new List<WebOrder>
            {
                new WebOrder { MemberId = memberId, OrderSubtotal = 5m, TaxAmount = 5m, ShippingCost = 10m, OrderDate = new DateTime(2015, 11, 22) },
                new WebOrder { MemberId = memberId, OrderSubtotal = 5m, TaxAmount = 5m, ShippingCost = 10m, OrderDate = new DateTime(2015, 11, 22) },
                new WebOrder { MemberId = memberId, OrderSubtotal = 5m, TaxAmount = 5m, ShippingCost = 10m, OrderDate = new DateTime(2015, 11, 22) },
                new WebOrder { MemberId = memberId, OrderSubtotal = 5m, TaxAmount = 5m, ShippingCost = 10m, OrderDate = new DateTime(2015, 11, 22) },
                new WebOrder { MemberId = memberId, OrderSubtotal = 5m, TaxAmount = 5m, ShippingCost = 10m, OrderDate = new DateTime(2015, 11, 22) }
            });

            ReportsController controller = new ReportsController(dbStub.Object);

            var result = await controller.MemberList(start: DateTime.MinValue, optionalEnd: DateTime.MaxValue) as ViewResult;

            Assert.That(result != null);
            Assert.That(result.Model, Is.InstanceOf<DateFilteredListViewModel<MemberListItemViewModel>>());

            var model = (DateFilteredListViewModel<MemberListItemViewModel>)result.Model;
            var items = model.Items;

            Assert.That(items.First().TotalSpentOnOrders, Is.EqualTo(100m));
        }
        public async void DateFilter_MemberWithThreeOrdersInDateRange_SetsOrderCountToThree()
        {
            Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake();
            SetupVeilDataAccessWithUser(dbStub, memberUser);
            SetupVeilDataAccessWithWebOrders(dbStub, new List<WebOrder>
            {
                new WebOrder { MemberId = memberId, OrderDate = new DateTime(2015, 11, 22) },
                new WebOrder { MemberId = memberId, OrderDate = new DateTime(2010, 01, 01) },
                new WebOrder { MemberId = memberId, OrderDate = new DateTime(2015, 11, 22) },
                new WebOrder { MemberId = memberId, OrderDate = new DateTime(2015, 11, 22) },
                new WebOrder { MemberId = memberId, OrderDate = new DateTime(2010, 01, 01) }
            });

            ReportsController controller = new ReportsController(dbStub.Object);

            var result = await controller.MemberList(start: new DateTime(2015, 11, 22), optionalEnd: new DateTime(2015, 11, 22)) as ViewResult;

            Assert.That(result != null);
            Assert.That(result.Model, Is.InstanceOf<DateFilteredListViewModel<MemberListItemViewModel>>());

            var model = (DateFilteredListViewModel<MemberListItemViewModel>)result.Model;
            var items = model.Items;

            Assert.That(items.First().OrderCount, Is.EqualTo(3));
        }
        public async void DateFilter_MemberWithNoOrders_SetsTotalSpentOnOrders0()
        {
            Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake();
            SetupVeilDataAccessWithUser(dbStub, memberUser);
            SetupVeilDataAccessWithWebOrders(dbStub, new List<WebOrder>());

            ReportsController controller = new ReportsController(dbStub.Object);

            var result = await controller.MemberList(start: DateTime.MinValue, optionalEnd: DateTime.MinValue) as ViewResult;

            Assert.That(result != null);
            Assert.That(result.Model, Is.InstanceOf<DateFilteredListViewModel<MemberListItemViewModel>>());

            var model = (DateFilteredListViewModel<MemberListItemViewModel>)result.Model;
            var items = model.Items;

            Assert.That(items.First().TotalSpentOnOrders, Is.EqualTo(0));
        }
        public async void TwoMembersWithDifferentTotals_OrdersByTotalSpentDescending()
        {
            Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake();
            SetupVeilDataAccessWithUser(dbStub, memberUser, memberUser2);
            SetupVeilDataAccessWithWebOrders(dbStub, new List<WebOrder>
            {
                new WebOrder { MemberId = memberId, OrderSubtotal = 10m, TaxAmount = 10m, ShippingCost = 10m },
                new WebOrder { MemberId = memberId2, OrderSubtotal = 5m, TaxAmount = 5m, ShippingCost = 5m }
            });

            ReportsController controller = new ReportsController(dbStub.Object);

            var result = await controller.MemberList() as ViewResult;

            Assert.That(result != null);
            Assert.That(result.Model, Is.InstanceOf<DateFilteredListViewModel<MemberListItemViewModel>>());

            var model = (DateFilteredListViewModel<MemberListItemViewModel>)result.Model;
            var items = model.Items;

            Assert.That(items.First().TotalSpentOnOrders, Is.GreaterThanOrEqualTo(items.Last().TotalSpentOnOrders));
            Assert.That(items.First().UserName, Is.EqualTo(memberUser.UserName));
            Assert.That(items.Last().UserName, Is.EqualTo(memberUser2.UserName));
        }