public async Task ScheduleShowtime_Stores_Showtimes()
        {
            var date         = DateTime.Today;
            var sessionTimes = new[]
            {
                date.AddHours(10),
                date.AddHours(12),
                date.AddHours(14),
            };

            await Sut.ScheduleShowtimes(theater.MovieTheaterId, movie.MovieId, sessionTimes);

            Mock.Get(UnitOfWork.Showtimes).Verify(r => r.Insert(It.Is <Showtimes>(s =>
                                                                                  s.MovieTheaterId == theater.MovieTheaterId &&
                                                                                  s.MovieId == movie.MovieId &&
                                                                                  sessionTimes.Contains(s.SessionTime))), Times.Exactly(3));
        }
        public async Task<ActionResult> Edit([Bind(Include = "MovieTheaterId, MovieId, Date, SessionTimesStr")] ShowtimesEdit model)
        {
            try
            {
                if (!string.IsNullOrWhiteSpace(model.SessionTimesStr))
                {
                    TimeSpan ts;

                    var sessionTimesInput = model.SessionTimesStr
                        .Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
                        .Select(s => s.Trim());

                    var sessionTimesAreInCorrectFormat = sessionTimesInput
                        .All(s => TimeSpan.TryParseExact(s, new[] { "h\\:mm", "hh\\:mm" }, null, out ts));

                    if (!sessionTimesAreInCorrectFormat)
                    {
                        ModelState.AddModelError("SessionTimesStr", "Session Times are invalid");
                    }
                    else if (sessionTimesInput.Distinct().Count() != sessionTimesInput.Count())
                    {
                        ModelState.AddModelError("SessionTimesStr", "Duplicate session times");
                    }
                }

                if ((await unitOfWork.MovieTheatres.FindAsync(model.MovieTheaterId)) == null)
                {
                    ModelState.AddModelError("MovieTheaterId", "Movie theater doesn't exist");
                }

                if ((await unitOfWork.Movies.FindAsync(model.MovieId)) == null)
                {
                    ModelState.AddModelError("MovieId", "Movie doesn't exist");
                }

                if (ModelState.IsValid)
                {
                    var sessionTimesInput = model.SessionTimesStr
                        .Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
                        .Select(s => s.Trim());

                    var sessionTimes = sessionTimesInput
                        .Select(t => model.Date.Date + TimeSpan.ParseExact(t, new[] { "h\\:mm", "hh\\:mm" }, null))
                        .ToArray();

                    var service = new ShowtimesSchedulingService(unitOfWork);

                    await service.ScheduleShowtimes(model.MovieTheaterId, model.MovieId, sessionTimes);
                    await unitOfWork.SaveAsync();

                    return RedirectToAction("Index", new { date = model.Date.ToString(Constants.UrlDateFormat) });
                }

                await FillMoviesSelectList(model.MovieId);
                await FillMovieTheatresSelectList(model.MovieTheaterId);

                return View(model);
            }
            catch
            {
                return View();
            }
        }
        public async Task <ActionResult> Edit([Bind(Include = "MovieTheaterId, MovieId, Date, SessionTimesStr")] ShowtimesEdit model)
        {
            try
            {
                if (!string.IsNullOrWhiteSpace(model.SessionTimesStr))
                {
                    TimeSpan ts;

                    var sessionTimesInput = model.SessionTimesStr
                                            .Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
                                            .Select(s => s.Trim());

                    var sessionTimesAreInCorrectFormat = sessionTimesInput
                                                         .All(s => TimeSpan.TryParseExact(s, new[] { "h\\:mm", "hh\\:mm" }, null, out ts));

                    if (!sessionTimesAreInCorrectFormat)
                    {
                        ModelState.AddModelError("SessionTimesStr", "Session Times are invalid");
                    }
                    else if (sessionTimesInput.Distinct().Count() != sessionTimesInput.Count())
                    {
                        ModelState.AddModelError("SessionTimesStr", "Duplicate session times");
                    }
                }

                if ((await unitOfWork.MovieTheatres.FindAsync(model.MovieTheaterId)) == null)
                {
                    ModelState.AddModelError("MovieTheaterId", "Movie theater doesn't exist");
                }

                if ((await unitOfWork.Movies.FindAsync(model.MovieId)) == null)
                {
                    ModelState.AddModelError("MovieId", "Movie doesn't exist");
                }

                if (ModelState.IsValid)
                {
                    var sessionTimesInput = model.SessionTimesStr
                                            .Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
                                            .Select(s => s.Trim());

                    var sessionTimes = sessionTimesInput
                                       .Select(t => model.Date.Date + TimeSpan.ParseExact(t, new[] { "h\\:mm", "hh\\:mm" }, null))
                                       .ToArray();

                    var service = new ShowtimesSchedulingService(unitOfWork);

                    await service.ScheduleShowtimes(model.MovieTheaterId, model.MovieId, sessionTimes);

                    await unitOfWork.SaveAsync();

                    return(RedirectToAction("Index", new { date = model.Date.ToString(Constants.UrlDateFormat) }));
                }

                await FillMoviesSelectList(model.MovieId);
                await FillMovieTheatresSelectList(model.MovieTheaterId);

                return(View(model));
            }
            catch
            {
                return(View());
            }
        }