public void WhenAddingReminder_ThenUpdatesServiceReminder()
        {
            const int newReminderId = 456;

            var vehicle = new Vehicle { VehicleId = DefaultVehicleId, Name = "vehicle" };

            _vehicleRepository
                .Setup(r => r.GetVehicle(DefaultUserId, DefaultVehicleId))
                .Returns(vehicle);

            _reminderRepository
                .Setup(r => r.Create(DefaultVehicleId, It.IsAny<Reminder>()))
                .Callback(new Action<int, Reminder>((vehicleId, reminder) =>
                                                        {
                                                            // represents the entity created internally
                                                            reminder.ReminderId = newReminderId;
                                                            reminder.VehicleId = DefaultVehicleId;
                                                        }));

            var formModel = new ReminderFormModel();

            var handler = new AddReminderToVehicle(_vehicleRepository.Object, _reminderRepository.Object);
            handler.Execute(DefaultUserId, DefaultVehicleId, formModel);

            Assert.Equal(newReminderId, formModel.ReminderId);
            Assert.Equal(DefaultVehicleId, formModel.VehicleId);
        }
        public void WhenReminderIdSet_ThenValueUpdated()
        {
            var target = new ReminderFormModel();

            target.ReminderId = 4;

            int actual = target.ReminderId;
            Assert.Equal(4, actual);
        }
        public void WhenTitleSet_ThenValueUpdated()
        {
            var target = new ReminderFormModel();

            target.Title = "Title";

            string actual = target.Title;
            Assert.Equal("Title", actual);
        }
        public void WhenDueDateSet_ThenValueUpdated()
        {
            var target = new ReminderFormModel();

            target.DueDate = new DateTime(2011, 01, 01);

            DateTime? actual = target.DueDate;
            Assert.NotNull(actual);
            Assert.Equal(new DateTime(2011, 01, 01), actual);
        }
        public void WhenDueDateSetToNull_ThenUpdatesValue()
        {
            var target = new ReminderFormModel();
            target.DueDate = new DateTime(2011, 01, 01);

            target.DueDate = null;

            DateTime? actual = target.DueDate;
            Assert.Null(actual);
        }
        public void WhenNeitherReminderDueDateNorDueDistanceSet_ThenValidationFails()
        {
            var target = new ReminderFormModel {Title = "Title"};

            var validationContext = new ValidationContext(target, null, null);
            var validationResults = new List<ValidationResult>();
            bool actual = Validator.TryValidateObject(target, validationContext, validationResults, true);

            Assert.False(actual);
        }
        public void WhenConstructed_ThenSuccessful()
        {
            var actual = new ReminderFormModel();

            Assert.NotNull(actual);
            Assert.Equal(0, actual.ReminderId);
            Assert.Null(actual.Title);
            Assert.Null(actual.Remarks);
            Assert.Null(actual.DueDate);
            Assert.Null(actual.DueDistance);
        }
        public void WhenDueDistanceSetToNegative_ThenValidationFails()
        {
            var target = new ReminderFormModel();
            target.Title = "Title";

            target.DueDistance = -5;

            var validationContext = new ValidationContext(target, null, null);
            var validationResults = new List<ValidationResult>();
            bool actual = Validator.TryValidateObject(target, validationContext, validationResults, true);

            Assert.False(actual);
            Assert.Equal(1, validationResults[0].MemberNames.Count());
            Assert.Equal("DueDistance", validationResults[0].MemberNames.First());
        }
        public void WhenCanAddReminder_ThenReturnsEmptyCollection()
        {
            var vehicle1 = new Vehicle { VehicleId = DefaultVehicleId, Name = "vehicle1" };

            _vehicleRepositoryMock
                .Setup(r => r.GetVehicle(DefaultUserId, DefaultVehicleId))
                .Returns(vehicle1);

            var handler = new CanAddReminder(_vehicleRepositoryMock.Object, _fillupRepo.Object);

            var formModel = new ReminderFormModel { VehicleId = DefaultVehicleId, Title = "Test", DueDistance = 20000 };

            var result = handler.Execute(DefaultUserId, formModel);

            Assert.Empty(result);
        }
        public void WhenCanAddReminderWithInvalidVehicleId_ThenReturnsValidationResult()
        {
            const int nonExistentVehicleId = -1;

            _vehicleRepositoryMock
                .Setup(vr => vr.GetVehicle(DefaultUserId, nonExistentVehicleId))
                .Returns((Vehicle)null);

            var handler = new CanAddReminder(_vehicleRepositoryMock.Object, _fillupRepo.Object);

            var formModel = new ReminderFormModel { VehicleId = nonExistentVehicleId, Title = "Test", DueDistance = 20000 };

            var result = handler.Execute(DefaultUserId, formModel);

            Assert.NotEmpty(result);
        }
        public void WhenRemarksSetTo251Characters_ThenValidationFails()
        {
            var target = new ReminderFormModel();
            target.Title = "Title";

            target.Remarks = new string('1', 251);

            var validationContext = new ValidationContext(target, null, null);
            var validationResults = new List<ValidationResult>();
            bool actual = Validator.TryValidateObject(target, validationContext, validationResults, true);

            Assert.False(actual);
            Assert.Equal(1, validationResults[0].MemberNames.Count());
            Assert.Equal("Remarks", validationResults[0].MemberNames.First());
        }
        public void WhenCanAddReminderWithInvalidDueDistance_ThenReturnsValidationResult()
        {
            var vehicle1 = new Vehicle
                               {
                                   VehicleId = DefaultVehicleId,
                                   Name = "vehicle1"
                               };

            _vehicleRepositoryMock
                .Setup(r => r.GetVehicle(DefaultUserId, DefaultVehicleId))
                .Returns(vehicle1);

            _fillupRepo
                .Setup(r => r.GetFillups(DefaultVehicleId))
                .Returns(new[] {new FillupEntry {Odometer = 7000}});

            var handler = new CanAddReminder(_vehicleRepositoryMock.Object, _fillupRepo.Object);

            var formModel = new ReminderFormModel { VehicleId = DefaultVehicleId, Title = "Test", DueDistance = 5000 };

            var result = handler.Execute(DefaultUserId, formModel);

            Assert.NotEmpty(result);
        }
        public void WhenConstructed_ThenIsFulfilledIsFalse()
        {
            var target = new ReminderFormModel();

            Assert.False(target.IsFulfilled);
        }
        public ActionResult Add(int vehicleId, ReminderFormModel reminder)
        {
            if ((reminder != null) && ModelState.IsValid)
            {
                var errors = Using<CanAddReminder>().Execute(CurrentUserId, reminder);
                ModelState.AddModelErrors(errors, "Add");

                if (ModelState.IsValid)
                {
                    Using<AddReminderToVehicle>().Execute(CurrentUserId, vehicleId, reminder);
                    return RedirectToAction("Details", "Reminder", new { id = reminder.ReminderId });
                }
            }

            var vehicles = Using<GetVehicleListForUser>()
                .Execute(CurrentUserId);

            var vehicle = vehicles.First(v => v.VehicleId == vehicleId);

            var reminders = Using<GetUnfulfilledRemindersForVehicle>()
                .Execute(CurrentUserId, vehicleId, vehicle.Odometer ?? 0)
                .Select(r => new ReminderSummaryModel(r, r.IsOverdue ?? false));

            var viewModel = new ReminderAddViewModel
            {
                VehicleList = new VehicleListViewModel(vehicles, vehicleId) { IsCollapsed = true },
                Reminder = reminder,
                Reminders = new SelectedItemList<ReminderSummaryModel>(reminders),
            };

            return View(viewModel);
        }
        public void WhenReminderDueDateAndDueDistanceNull_ThenIsOverdueReturnsFalse()
        {
            var reminder = new ReminderFormModel() {Title = "future reminder", DueDate = null, DueDistance = null};

            reminder.UpdateLastVehicleOdometer(10);
            bool isOverdue = reminder.IsOverdue;

            Assert.False(isOverdue);
        }
        public void WhenReminderIsOverdueByDateAndDueDistanceNull_ThenIsOverdueReturnsTrue()
        {
            var reminder = new ReminderFormModel()
                               {Title = "future reminder", DueDate = DateTime.UtcNow.AddDays(-2), DueDistance = null};

            reminder.UpdateLastVehicleOdometer(10);
            bool isOverdue = reminder.IsOverdue;

            Assert.True(isOverdue);
        }
        public void WhenReminderIsNotOverdue_ThenIsOverdueReturnsFalse()
        {
            var reminder = new ReminderFormModel()
                               {Title = "future reminder", DueDate = DateTime.UtcNow.AddDays(2), DueDistance = 10000};

            reminder.UpdateLastVehicleOdometer(10);
            bool isOverdue = reminder.IsOverdue;

            Assert.False(isOverdue);
        }
        public void WhenRemarksSet_ThenValueUpdated()
        {
            var target = new ReminderFormModel();

            target.Remarks = "Remarks";

            string actual = target.Remarks;
            Assert.Equal("Remarks", actual);
        }
        public void WhenDueDistanceSetToNull_ThenUpdatesValue()
        {
            var target = new ReminderFormModel();
            target.DueDistance = 5;

            target.DueDistance = null;

            int? actual = target.DueDistance;
            Assert.Null(actual);
        }
        public void WhenTitleSetToNull_ThenUpdatesValue()
        {
            var target = new ReminderFormModel();
            target.Title = "Title";

            target.Title = null;

            string actual = target.Title;
            Assert.Null(actual);
        }
        public void WhenRemarksSetToNull_ThenUpdatesValue()
        {
            var target = new ReminderFormModel();
            target.Remarks = "Remarks";

            target.Remarks = null;

            string actual = target.Remarks;
            Assert.Null(actual);
        }
        public void WhenTitleSetToValidValue_ThenValidationPasses()
        {
            var target = new ReminderFormModel();

            target.Title = "Title";
            target.DueDate = DateTime.UtcNow;

            var validationContext = new ValidationContext(target, null, null);
            var validationResults = new List<ValidationResult>();
            bool actual = Validator.TryValidateObject(target, validationContext, validationResults, true);

            Assert.True(actual);
            Assert.Equal(0, validationResults.Count);
        }
        public void WhenDueDistanceSet_ThenValueUpdated()
        {
            var target = new ReminderFormModel();

            target.DueDistance = 5;

            int? actual = target.DueDistance;
            Assert.NotNull(actual);
            Assert.Equal(5, actual);
        }