public When_Qualification_SaveQualification_Has_No_Selected_Routes() { var qualificationService = Substitute.For <IQualificationService>(); var providerVenueService = Substitute.For <IProviderVenueService>(); var providerQualificationService = Substitute.For <IProviderQualificationService>(); var routePathService = Substitute.For <IRoutePathService>(); var qualificationController = new QualificationController(providerVenueService, qualificationService, providerQualificationService, routePathService); var controllerWithClaims = new ClaimsBuilder <QualificationController>(qualificationController) .AddUserName("username") .AddEmail("*****@*****.**") .Build(); var viewModel = new SaveQualificationViewModel { QualificationId = 1, Title = "Qualification title", ShortTitle = new string("Short Title"), Source = "Test", Routes = new List <RouteSummaryViewModel> { new RouteSummaryViewModel { Id = 1, Name = "Route 1", IsSelected = false } } }; _result = controllerWithClaims.SaveQualificationAsync(viewModel).GetAwaiter().GetResult(); }
public async Task UpdateQualificationAsync(SaveQualificationViewModel viewModel) { var qualification = await _qualificationRepository.GetSingleOrDefaultAsync(v => v.Id == viewModel.QualificationId); qualification = _mapper.Map(viewModel, qualification); await _qualificationRepository.UpdateAsync(qualification); var existingMappings = _qualificationRouteMappingRepository .GetManyAsync(r => r.QualificationId == viewModel.QualificationId) .ToList(); var comparer = new QualificationRouteMappingEqualityComparer(); var newMappings = _mapper.Map <IList <QualificationRouteMapping> >(viewModel); var toBeAdded = newMappings.Except(existingMappings, comparer).ToList(); var same = existingMappings.Intersect(newMappings, comparer).ToList(); var toBeDeleted = existingMappings.Except(same).ToList(); QualificationRouteMapping Find(QualificationRouteMapping qrpm) => existingMappings.First(r => r.Id == qrpm.Id); var deleteMappings = toBeDeleted.Select(Find).ToList(); await _qualificationRouteMappingRepository.DeleteManyAsync(deleteMappings); foreach (var toBeAddedItem in toBeAdded) { await _qualificationRouteMappingRepository.CreateAsync(toBeAddedItem); } }
public async Task <IActionResult> SaveQualificationAsync(SaveQualificationViewModel viewModel) { Validate(viewModel); if (!ModelState.IsValid) { var errorList = ModelState.Where(e => e.Value.Errors.Any()).ToDictionary( kvp => kvp.Key, kvp => kvp.Value.Errors.Select(e => e.ErrorMessage).ToArray() ); var errors = JsonConvert.SerializeObject(errorList); return(Json(new { success = false, response = errors })); } await _qualificationService.UpdateQualificationAsync(viewModel); return(Json(new { success = true, response = string.Empty })); }
public When_Qualification_SaveQualification_Is_Called() { var providerVenueService = Substitute.For <IProviderVenueService>(); var providerQualificationService = Substitute.For <IProviderQualificationService>(); var routePathService = Substitute.For <IRoutePathService>(); var routes = new List <SelectListItem> { new SelectListItem { Text = "1", Value = "Route 1" }, new SelectListItem { Text = "2", Value = "Route 2" } }; var routeDictionary = new Dictionary <int, string> { { 1, "Route 1" }, { 2, "Route 2" } }; routePathService.GetRouteSelectListItemsAsync().Returns(routes); routePathService.GetRouteDictionaryAsync().Returns(routeDictionary); _qualificationService = Substitute.For <IQualificationService>(); _qualificationService.GetQualificationByIdAsync(1) .Returns(new QualificationSearchResultViewModel { QualificationId = 1, Title = "Qualification title", ShortTitle = new string('X', 100), RouteIds = new List <int> { 1 } }); var qualificationController = new QualificationController(providerVenueService, _qualificationService, providerQualificationService, routePathService); var controllerWithClaims = new ClaimsBuilder <QualificationController>(qualificationController) .AddUserName("username") .AddEmail("*****@*****.**") .Build(); var viewModel = new SaveQualificationViewModel { QualificationId = 1, Title = "Qualification title", ShortTitle = new string('X', 100), Source = "Test", Routes = new List <RouteSummaryViewModel> { new RouteSummaryViewModel { Id = 1, Name = "Route 1", IsSelected = true } } }; _result = controllerWithClaims.SaveQualificationAsync(viewModel).GetAwaiter().GetResult(); }
public When_QualificationService_Is_Called_To_UpdateQualification() { var httpContextAccessor = Substitute.For <IHttpContextAccessor>(); httpContextAccessor.HttpContext.Returns(new DefaultHttpContext { User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.GivenName, "adminUserName") })) }); var dateTimeProvider = Substitute.For <IDateTimeProvider>(); dateTimeProvider.UtcNow().Returns(new DateTime(2019, 1, 1)); var config = new MapperConfiguration(c => { c.AddMaps(typeof(QualificationMapper).Assembly); c.ConstructServicesUsing(type => type.Name.Contains("LoggedInUserEmailResolver") ? new LoggedInUserEmailResolver <SaveQualificationViewModel, Domain.Models.Qualification>(httpContextAccessor) : type.Name.Contains("LoggedInUserNameResolver") ? (object)new LoggedInUserNameResolver <SaveQualificationViewModel, Domain.Models.Qualification>(httpContextAccessor) : type.Name.Contains("UtcNowResolver") ? new UtcNowResolver <SaveQualificationViewModel, Domain.Models.Qualification>(dateTimeProvider) : null); }); var mapper = new Mapper(config); var learningAimReferenceRepository = Substitute.For <IRepository <LearningAimReference> >(); _qualificationRepository = Substitute.For <IRepository <Domain.Models.Qualification> >(); _qualificationRepository .GetSingleOrDefaultAsync(Arg.Any <Expression <Func <Domain.Models.Qualification, bool> > >()) .Returns(new ValidQualificationBuilder().Build()); _qualificationRouteMappingRepository = Substitute.For <IRepository <QualificationRouteMapping> >(); _qualificationRouteMappingRepository .GetManyAsync(Arg.Any <Expression <Func <QualificationRouteMapping, bool> > >()) .Returns(new List <QualificationRouteMapping> { new QualificationRouteMapping { Id = 101, QualificationId = 1, RouteId = 1 }, new QualificationRouteMapping { Id = 102, QualificationId = 1, RouteId = 2 } }.AsQueryable()); var qualificationService = new QualificationService(mapper, _qualificationRepository, _qualificationRouteMappingRepository, learningAimReferenceRepository); //Set up routes 1 and 2 in the database, //then 2 and 3 selected in the view model. //Should end up with mapping for route 1 deleted //and route 3 added var viewModel = new SaveQualificationViewModel { QualificationId = 1, Title = "Title", ShortTitle = "Modified Short Title", Source = "Test", Routes = new List <RouteSummaryViewModel> { new RouteSummaryViewModel { Id = 1, Name = "Route 1", IsSelected = false }, new RouteSummaryViewModel { Id = 2, Name = "Route 2", IsSelected = true }, new RouteSummaryViewModel { Id = 3, Name = "Route 1", IsSelected = true } } }; qualificationService.UpdateQualificationAsync(viewModel).GetAwaiter().GetResult(); }