public async Task <ActionResult> Create(CountdownCreateViewModel model) { if (ModelState.IsValid) { DateTime endsOnDate = CreateEndsOnDate(model); if (endsOnDate < _systemClock.UtcNow.AddMinutes(4)) { return(new HttpStatusCodeResult(400, "Bad Request")); } var countdown = new Countdown { Description = model.Description, CreatedOn = _systemClock.UtcNow, CreatedByAccountId = (int)_contextService.CurrentUserAccountId, EndsOn = endsOnDate }; await _countdownRepository.CreateAsync(countdown); _notificationService.UpdateClientsAfterCreate(countdown); return(Json(new { countdown.Id })); } return(new HttpStatusCodeResult(400, "Bad Request")); }
private DateTime CreateDateFromDuration(CountdownCreateViewModel model) { switch (model.SelectedDurationType) { case CountdownCreateViewModel.DurationType.Seconds: return(_systemClock.UtcNow.AddSeconds(model.Duration)); case CountdownCreateViewModel.DurationType.Minutes: return(_systemClock.UtcNow.AddMinutes(model.Duration)); case CountdownCreateViewModel.DurationType.Hours: return(_systemClock.UtcNow.AddHours(model.Duration)); case CountdownCreateViewModel.DurationType.Days: return(_systemClock.UtcNow.AddDays(model.Duration)); case CountdownCreateViewModel.DurationType.Months: return(_systemClock.UtcNow.AddMonths(model.Duration)); case CountdownCreateViewModel.DurationType.Years: return(_systemClock.UtcNow.AddYears(model.Duration)); default: throw new ArgumentException("Invalid duration"); } }
public async Task PostFromAnAuthenticatedUserWithValidViewModel_CreatesACountdownFromDateSegmentsWithCorrectTime() { TestableCountdownController controller = TestableCountdownController.Create(); const int currentUserAccountId = 7; controller.MockContextService.Setup(x => x.CurrentUserAccountId).Returns(currentUserAccountId); var model = new CountdownCreateViewModel { Description = "Test Description", SelectedCountdownType = CountdownCreateViewModel.CountdownType.Date, EndsOnDay = 7, EndsOnMonth = 3, EndsOnYear = 2017, EndsOnHour = 13, EndsOnMinute = 5 }; ActionResult result = await controller.Create(model); Countdown countdown = controller.CountdownRepository.Countdowns.FirstOrDefault(); Assert.IsNotNull(result); Assert.IsNotNull(countdown); Assert.AreEqual(model.Description, countdown.Description); Assert.AreEqual(currentUserAccountId, countdown.CreatedByAccountId); Assert.AreEqual(new DateTime(model.EndsOnYear, model.EndsOnMonth, model.EndsOnDay, (int)model.EndsOnHour, (int)model.EndsOnMinute, 0), countdown.EndsOn); }
public async Task PostFromAnAuthenticatedUserWithValidViewModel_CreatesACountdownFromDurationWithCorrectTime(DateTime systemTime, CountdownCreateViewModel.DurationType durationType, int duration, DateTime expectedEndDate) { TestableCountdownController controller = TestableCountdownController.Create(); const int currentUserAccountId = 7; controller.MockContextService.Setup(x => x.CurrentUserAccountId).Returns(currentUserAccountId); controller.MockSystemClock.Setup(x => x.UtcNow).Returns(systemTime); var model = new CountdownCreateViewModel { Description = "Test Description", SelectedCountdownType = CountdownCreateViewModel.CountdownType.Duration, Duration = duration, SelectedDurationType = durationType }; ActionResult result = await controller.Create(model); Countdown countdown = controller.CountdownRepository.Countdowns.FirstOrDefault(); Assert.IsNotNull(result); Assert.IsNotNull(countdown); Assert.AreEqual(model.Description, countdown.Description); Assert.AreEqual(systemTime, countdown.CreatedOn); Assert.AreEqual(expectedEndDate, countdown.EndsOn); Assert.AreEqual(currentUserAccountId, countdown.CreatedByAccountId); }
private DateTime CreateEndsOnDate(CountdownCreateViewModel model) { switch (model.SelectedCountdownType) { case CountdownCreateViewModel.CountdownType.Duration: return(CreateDateFromDuration(model)); case CountdownCreateViewModel.CountdownType.Date: return(new DateTime(model.EndsOnYear, model.EndsOnMonth, model.EndsOnDay, model.EndsOnHour ?? 0, model.EndsOnMinute ?? 0, 0)); default: throw new Exception("Can't generate EndsOnDate"); } }
public async Task PostFromAnAuthenticatedUserWithValidViewModel_ReturnsJsonResultWithCountdownId() { TestableCountdownController controller = TestableCountdownController.Create(); controller.MockContextService.Setup(x => x.CurrentUserAccountId).Returns(1); var model = new CountdownCreateViewModel { Description = "Test Description", SelectedCountdownType = CountdownCreateViewModel.CountdownType.Duration, Duration = 300, SelectedDurationType = CountdownCreateViewModel.DurationType.Seconds }; JsonResult result = await controller.Create(model) as JsonResult; dynamic data = result?.Data; Assert.IsNotNull(result); Assert.AreEqual(1, data.Id); }
public async Task PostFromAnAuthenticatedUserWithValuesThatSetAEndsOnDateLessThan5MinutesInFuture_ReturnsHttpStatusCodeResult400BadRequest() { TestableCountdownController controller = TestableCountdownController.Create(); var systemTime = new DateTime(2017, 7, 1, 15, 17, 1); controller.MockContextService.Setup(x => x.CurrentUserAccountId).Returns(1); controller.MockSystemClock.Setup(x => x.UtcNow).Returns(systemTime); var model = new CountdownCreateViewModel { Description = "Test Description", SelectedCountdownType = CountdownCreateViewModel.CountdownType.Duration, Duration = 71, SelectedDurationType = CountdownCreateViewModel.DurationType.Seconds }; HttpStatusCodeResult result = await controller.Create(model) as HttpStatusCodeResult; Assert.IsNotNull(result); Assert.AreEqual(400, result.StatusCode); Assert.AreEqual("Bad Request", result.StatusDescription); }