예제 #1
0
        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"));
        }
예제 #2
0
        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");
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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");
            }
        }
예제 #6
0
        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);
        }
예제 #7
0
        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);
        }