[InlineData("453a2901-150b-4211-84b1-a40ac2ba4a35", 16, 5, false)] // Unsuccessful Rate (User not in group) public void TestPostRating(string userAspId, int groupId, int ratingValue, bool expectingSuccess) { var controllerContextMock = new Mock <ControllerContext>() { CallBase = true }; var contextMock = new Mock <ApplicationDbContext>() { CallBase = true }; contextMock.Setup(c => c.SaveChanges()).Returns(1); var controller = new GroupsController { ControllerContext = controllerContextMock.Object, Context = contextMock.Object, GetUserId = () => userAspId }; var initialRateCall = controller.Rate(groupId); if (initialRateCall is HttpNotFoundResult) { // give an error because viewmodel cannot be extracted Assert.True(!expectingSuccess); } else { // ReSharper disable once PossibleNullReferenceException var ratingViewModel = (GroupRatingViewModel)(initialRateCall as ViewResult).Model; var newRatingDictionary = new Dictionary <string, int>(); foreach (var kvp in ratingViewModel.UserRatings) { newRatingDictionary.Add(kvp.Key, ratingValue); } var newViewModel = new GroupRatingViewModel() { GroupId = ratingViewModel.GroupId, UserRatings = newRatingDictionary }; var result = controller.PostRating(newViewModel); if (expectingSuccess) { Assert.True(result is RedirectToRouteResult); } else { var valContext = new ValidationContext(newViewModel, null, null); var valResults = new List <ValidationResult>(); if (Validator.TryValidateObject(newViewModel, valContext, valResults, true)) { Assert.True(result is HttpNotFoundResult); } else { // This means that the passed model was not valid, meaning the system will not successfully save. // However, ModelState object of the controller does not work properly in unit test cases. // So, we deem this test a success, as if it had failed. Assert.True(true); } } } }
// GET: RatingControls/Details/5 public async Task <IActionResult> Group(int?id, int?disciplineId, string ReturnUrl) { if (id == null || disciplineId == null) { return(NotFound()); } var groupRating = new GroupRatingViewModel(); groupRating.RatingControls = await _context.RatingControls .Include(x => x.StudentRatings) .Where(x => x.SemesterDisciplineId == disciplineId && x.GroupId == id) .OrderBy(x => x.Number) .ToListAsync(); groupRating.Group = _context.AcademicGroups .Include(x => x.Specialty) .Include(x => x.Students.OrderBy(y => y.FullName)) .ThenInclude(x => x.ActivityProtections .Where(y => _context.Activities .Where(z => z.SemesterDisciplineId == disciplineId) .Any(h => y.ActivityId == h.Id))) .FirstOrDefault(x => x.Id == id); groupRating.SemesterDiscipline = _context.SemesterDiscipline .Include(x => x.Discipline) .Include(x => x.Activities.OrderBy(x => x.Type).ThenBy(x => x.Number)) .ThenInclude(y => y.Type) .FirstOrDefault(x => x.Id == disciplineId); if (groupRating.SemesterDiscipline.Activities.Count() > 0) { if (groupRating.SemesterDiscipline.ControlType == ControlType.Exam) { var examMultiplier = 1f; var pointMultiplier = 1f; var exam = groupRating.SemesterDiscipline.Activities .FirstOrDefault(x => x.Type.Name == EXAMTYPENAME); if (exam != null) { examMultiplier = (float)(40f / exam.MaxPoints); groupRating.SemesterDiscipline.Activities = groupRating.SemesterDiscipline.Activities .Where(x => x.Type.Name != EXAMTYPENAME) .ToList(); //ToList().RemoveAll() обязательно заработает :/ var wttt = groupRating.SemesterDiscipline.Activities.Select(x => x.MaxPoints).Sum(); if (groupRating.SemesterDiscipline.Activities.Count() > 0) { pointMultiplier = (float)(60f / groupRating.SemesterDiscipline.Activities.Select(x => x.MaxPoints).Sum()); } groupRating.SemesterDiscipline.Activities.Add(exam); foreach (var student in groupRating.Group.Students) { foreach (var protection in student.ActivityProtections) { if (protection.ActivityId == exam.Id) { protection.Points *= examMultiplier; } else { protection.Points *= pointMultiplier; } } } } else { foreach (var student in groupRating.Group.Students) { foreach (var protection in student.ActivityProtections) { protection.Points *= pointMultiplier; } } } } else { var pointMultiplier = (int)(100 / groupRating.SemesterDiscipline.Activities.Select(x => x.MaxPoints).Sum()); foreach (var student in groupRating.Group.Students) { foreach (var protection in student.ActivityProtections) { protection.Points *= pointMultiplier; } } } } ViewData["ReturnUrl"] = ReturnUrl; return(View(groupRating)); }