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"); }
public async Task <IActionResult> Add() { SearchShiftViewModel viewModel = new SearchShiftViewModel { StoreNames = await this.GetStoreNames(), NewShift = new ShiftViewModel() }; return(View(viewModel)); }
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)); }
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()); }
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); }
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)); }
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 }
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)); }
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 })); }