public async Task Search_SearchViewModel_ResultsFilteredByLocation()
        {
            // Arrange
            IRepository <Library.Models.Shift> shiftRepository = Substitute.For <IRepository <Library.Models.Shift> >();

            shiftRepository.Get(Arg.Any <string>(), Arg.Any <IDictionary <string, object> >(), Arg.Any <string>()).Returns(new []
            {
                new Library.Models.Shift {
                    StartDateTime = DateTime.Now.Add(new TimeSpan(1, 0, 0, 0)), LocationId = "1"
                },
            });
            ILocationService locationService = Substitute.For <ILocationService>();

            locationService.Get().Returns(new[] { new Library.Models.Location {
                                                      id = "1", Name = "Contoso"
                                                  }, new Library.Models.Location {
                                                      id = "2", Name = "Fabrikam"
                                                  } });
            ShiftsController     controller = this.GetController(shiftRepository: shiftRepository, locationService: locationService);
            SearchShiftViewModel viewModel  = new SearchShiftViewModel {
                Locations = new List <string> {
                    "Contoso"
                }, Start = DateTime.Now
            };

            // Act
            IActionResult result = await controller.Index(viewModel);

            // Assert
            ViewResult           viewResult      = Assert.IsType <ViewResult>(result);
            SearchShiftViewModel viewModelResult = Assert.IsAssignableFrom <SearchShiftViewModel>(viewResult.ViewData.Model);

            Assert.Contains <ShiftViewModel>(viewModelResult.Result, x => x.LocationName == "Contoso");
            Assert.DoesNotContain <ShiftViewModel>(viewModelResult.Result, x => x.LocationName == "Fabrikam");
        }
Exemplo n.º 2
0
        public async Task <IActionResult> Add()
        {
            SearchShiftViewModel viewModel = new SearchShiftViewModel
            {
                StoreNames = await this.GetStoreNames(),
                NewShift   = new ShiftViewModel()
            };

            return(View(viewModel));
        }
Exemplo n.º 3
0
        public async Task <IActionResult> Search(SearchShiftViewModel search)
        {
            IEnumerable <Shift>  shifts    = this.shiftRepository.Get(x => x.StoreName == search.NewShift.StoreName);
            SearchShiftViewModel viewModel = new SearchShiftViewModel
            {
                StoreNames = await this.GetStoreNames(),
                Result     = shifts.Where(x => x.Start.DayOfYear >= search.Start.DayOfYear)
                             .Map()
                             .Where(x => search.Available ? x.Available > 0 : true)
            };

            return(View("Index", viewModel));
        }
Exemplo n.º 4
0
        public async Task <IActionResult> AddShift(SearchShiftViewModel viewModel)
        {
            if (!ModelState.IsValid)
            {
                return(View("Add", viewModel));
            }

            List <Shift> shifts = viewModel.NewShift.Map().ToList();

            shifts.ForEach(async x => await this.shiftRepository.Add(x));

            return(await this.Index());
        }
Exemplo n.º 5
0
        private async Task <SearchShiftViewModel> GetShifts(IEnumerable <Location> locations, string sql, IDictionary <string, object> parameters, bool available = true, string filterLocation = null)
        {
            IEnumerable <Shift> shifts = await this.shiftRepository.Get(sql, parameters);

            IEnumerable <ShiftViewModel> shiftViewModels = shifts.Map(locations).Where(x => available ? x.Available > 0 : true);
            SearchShiftViewModel         viewModel       = new SearchShiftViewModel
            {
                LocationNames = this.GetLocationNames(locations),
                Result        = shiftViewModels.Where(x => string.IsNullOrEmpty(filterLocation) ? true : x.LocationName == filterLocation).OrderBy(x => x.Start),
                MapPoints     = this.GetMapPoints(shiftViewModels, locations)
            };

            return(viewModel);
        }
Exemplo n.º 6
0
        public async Task <IActionResult> Index(SearchShiftViewModel search = null)
        {
            IEnumerable <Location> locations = await this.locationService.Get();

            if (locations == null || !locations.Any())
            {
                this.logger.LogInformation("No locations, so redirecting to location view");
                Claim id = HttpContext?.User?.Claims?.Where(x => x.Type == "extension_zaprole").FirstOrDefault();

                if (id.Value == "org_a_manager")
                {
                    return(Redirect("/Locations"));
                }
            }

            return(await this.Search(search ?? new SearchShiftViewModel(), locations));
        }
Exemplo n.º 7
0
        public async Task <IActionResult> Index()
        {
            Organization organization = (await this.organizationRepository.Get()).FirstOrDefault();

            if (organization.Stores == null || !organization.Stores.Any())
            {
                return(Redirect("/Organization"));
            }

            IEnumerable <Shift>  shifts    = this.shiftRepository.Get(x => x.Start > DateTime.Now);
            SearchShiftViewModel viewModel = new SearchShiftViewModel
            {
                StoreNames = await this.GetStoreNames(),
                Result     = shifts.Map()
            };

            return(View("Index", viewModel));
        }
        public async Task Search_SearchViewModel_LocationsServiceHitOnce()
        {
            // Arrange
            ILocationService locationService = Substitute.For <ILocationService>();
            ShiftsController controller      = this.GetController(locationService: locationService);

            controller.HttpContext.User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim("extension_zaprole", "org_a_manager") }));
            SearchShiftViewModel viewModel = new SearchShiftViewModel {
                Locations = new List <string> {
                    "Contoso"
                }, Start = DateTime.Now
            };

            // Act
            await controller.Index(viewModel);

            // Assert
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
            locationService.Received(1).Get();
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
        }
Exemplo n.º 9
0
        private async Task <IActionResult> Search(SearchShiftViewModel search, IEnumerable <Location> locations)
        {
            List <string> locationIds = new List <string>();

            if (search.Locations != null && search.Locations.Any())
            {
                locationIds.AddRange(locations.Where(x => search.Locations.Contains(x.Name)).Select(x => x.id).ToList());
            }
            if (search.DistanceInMeters != null && !string.IsNullOrWhiteSpace(search.ZipOrPostcode))
            {
                Point point = await this.mapService.GetCoordinates(new Address { ZipOrPostcode = search.ZipOrPostcode });

                IEnumerable <Location> filteredLocations = await this.locationService.GetByDistance(point, search.DistanceInMeters.Value);

                locationIds.AddRange(filteredLocations.Select(x => x.id));
            }

            string sql = "SELECT * FROM c WHERE c.StartDateTime >= @startDateTime";
            IDictionary <string, object> parameters = new Dictionary <string, object>
            {
                { "@startDateTime", search.Start }
            };

            if (locationIds.Any())
            {
                sql += " AND ARRAY_CONTAINS(@locationIds, c.LocationId)";
                parameters.Add("@locationIds", locationIds);
            }

            SearchShiftViewModel results = await this.GetShifts(locations, sql, parameters, search.Available, search.FilterByLocation);

            search.Result        = results.Result;
            search.MapPoints     = results.MapPoints;
            search.LocationNames = results.LocationNames;

            ViewData["AzureMapsKey"] = this.configuration["AzureMapsSubscriptionKey"];

            return(View("Index", search));
        }
Exemplo n.º 10
0
 public IActionResult OnSearch(SearchShiftViewModel search)
 {
     return(RedirectToAction("Index", new { Start = search.Start.ToString("yyyy-MM-ddTHH:mm"), search.Locations, search.UseMyLocation, search.Available, search.ZipOrPostcode, search.DistanceInMeters }));
 }