public async Task Courses_ShouldReturnRedirectToAction_GivenInvalidUser()
        {
            // Arrange
            var userManager = UserManagerMock.GetMock;

            userManager.GetUserId(null);

            var controller = new TrainersController(
                userManager.Object,
                certificateService: null,
                courseService: null,
                examService: null,
                trainerService: null)
            {
                TempData = TempDataMock.GetMock
            };

            // Act
            var result = await controller.Courses(It.IsAny <string>(), It.IsAny <int>());

            // Assert
            controller.TempData.AssertErrorMsg(WebConstants.InvalidUserMsg);

            this.AssertRedirectToCoursesControllerIndex(result);

            userManager.Verify();
        }
        public async Task EvaluateExam_ShouldReturnRedirectToAction_GivenInvalidUser()
        {
            // Arrange
            var courseService = CourseServiceMock.GetMock;

            courseService.Exists(true);

            var userManager = UserManagerMock.GetMock;

            userManager.GetUserId(null);

            var controller = new TrainersController(
                userManager.Object,
                certificateService: null,
                courseService.Object,
                examService: null,
                trainerService: null)
            {
                TempData = TempDataMock.GetMock
            };

            // Act
            var result = await controller.EvaluateExam(TestCourseId, It.IsAny <StudentCourseGradeFormModel>());

            // Assert
            controller.TempData.AssertErrorMsg(WebConstants.InvalidUserMsg);

            // Result
            this.AssertRedirectToTrainersControllerIndex(result);

            courseService.Verify();
            userManager.Verify();
        }
        public async Task EvaluateExam_ShouldReturnRedirectToActionWithCorrectRouteValues_GivenModelError()
        {
            // Arrange
            var courseService = CourseServiceMock.GetMock;

            courseService.Exists(true);

            var controller = new TrainersController(
                userManager: null,
                certificateService: null,
                courseService.Object,
                examService: null,
                trainerService: null)
            {
                TempData = TempDataMock.GetMock
            };

            controller.ModelState.AddModelError(string.Empty, "Error"); // model error

            // Act
            var result = await controller.EvaluateExam(TestCourseId, It.IsAny <StudentCourseGradeFormModel>());

            // Assert
            controller.TempData.AssertErrorMsg(WebConstants.GradeInvalidMsg);

            this.AssertRedirectToTrainersControllerStudents(result);
            this.AssertRouteWithId(result);

            courseService.Verify();
        }
        public async Task Students_ShouldReturnRedirectToAction_GivenInvalidCourse()
        {
            // Arrange
            var courseService = new Mock <ICourseService>();

            courseService.Exists(false);

            var controller = new TrainersController(
                userManager: null,
                certificateService: null,
                courseService.Object,
                examService: null,
                trainerService: null)
            {
                TempData = TempDataMock.GetMock
            };

            // Act
            var result = await controller.Students(TestCourseId);

            // Assert
            controller.TempData.AssertErrorMsg(WebConstants.CourseNotFoundMsg);

            this.AssertRedirectToTrainersControllerIndex(result);

            courseService.Verify();
        }
        public async Task EvaluateExam_ShouldReturnRedirectToActionWithCorrectRouteValuesAndCertificateSuccessMsg_GivenCertificatetSuccess()
        {
            // Arrange
            var testModel = this.GetStudentInCourseWithGrade();

            var courseService = CourseServiceMock.GetMock;

            courseService
            .Exists(true)
            .IsUserEnrolledInCourseAsync(true);

            var userManager = UserManagerMock.GetMock;

            userManager.GetUserId(TestUserId);

            var trainerService = TrainerServiceMock.GetMock;

            trainerService
            .IsTrainerForCourseAsync(true)
            .CourseHasEndedAsync(true);

            var examService = ExamServiceMock.GetMock;

            examService.EvaluateAsync(true);

            var certificateService = CertificateServiceMock.GetMock;

            certificateService
            .IsGradeEligibleForCertificate(true)
            .CreateAsync(true);

            var controller = new TrainersController(
                userManager.Object,
                certificateService.Object,
                courseService.Object,
                examService.Object,
                trainerService.Object)
            {
                TempData = TempDataMock.GetMock
            };

            // Act
            var result = await controller.EvaluateExam(TestCourseId, testModel);

            // Assert
            controller.TempData.AssertSuccessMsg(
                WebConstants.ExamAssessedMsg
                + Environment.NewLine
                + WebConstants.CertificateIssuedMsg);

            this.AssertRedirectToTrainersControllerStudents(result);
            this.AssertRouteWithId(result);

            certificateService.Verify();
            courseService.Verify();
            examService.Verify();
            trainerService.Verify();
            userManager.Verify();
        }
        public async Task EvaluateExam_ShouldReturnRedirectToActionWithCorrectRouteValues_GivenAssessmentError()
        {
            // Arrange
            var testModel = this.GetStudentInCourseWithGrade();

            var courseService = CourseServiceMock.GetMock;

            courseService
            .Exists(true)
            .IsUserEnrolledInCourseAsync(true);

            var userManager = UserManagerMock.GetMock;

            userManager.GetUserId(TestUserId);

            var trainerService = TrainerServiceMock.GetMock;

            trainerService
            .IsTrainerForCourseAsync(true)
            .CourseHasEndedAsync(true);

            var examService = ExamServiceMock.GetMock;

            examService.EvaluateAsync(false);

            var controller = new TrainersController(
                userManager.Object,
                certificateService: null,
                courseService.Object,
                examService.Object,
                trainerService.Object)
            {
                TempData = TempDataMock.GetMock
            };

            // Act
            var result = await controller.EvaluateExam(TestCourseId, testModel);

            // Assert
            controller.TempData.AssertErrorMsg(WebConstants.ExamAssessmentErrorMsg);

            this.AssertRedirectToTrainersControllerStudents(result);
            this.AssertRouteWithId(result);

            courseService.Verify();
            examService.Verify();
            trainerService.Verify();
            userManager.Verify();
        }
        public async Task Students_ShouldReturnViewResultWithCorrectModel_GivenValidInput()
        {
            // Arrange
            var testCourse = Tests.GetCourseServiceModelCollection().FirstOrDefault();

            var courseService = CourseServiceMock.GetMock;

            courseService.Exists(true);

            var userManager = UserManagerMock.GetMock;

            userManager.GetUserId(TestUserId);

            var trainerService = TrainerServiceMock.GetMock;

            trainerService
            .IsTrainerForCourseAsync(true)
            .CourseByIdAsync(testCourse)
            .StudentsInCourseAsync(this.GetStudentInCourseServiceModelCollection());

            var controller = new TrainersController(
                userManager.Object,
                certificateService: null,
                courseService.Object,
                examService: null,
                trainerService.Object);

            // Act
            var result = await controller.Students(TestCourseId);

            // Assert
            var viewResult = Assert.IsType <ViewResult>(result);
            var model      = Assert.IsType <StudentCourseGradeViewModel>(viewResult.Model);

            Assert.NotNull(model);
            Tests.AssertCourseServiceModel(testCourse, model.Course);
            this.AssertStudentsInCourse(model.Students);

            courseService.Verify();
            trainerService.Verify();
            userManager.Verify();
        }
        public async Task EvaluateExam_ShouldReturnRedirectToAction_BeforeCourseEndDate()
        {
            // Arrange
            var courseService = CourseServiceMock.GetMock;

            courseService.Exists(true);

            var userManager = UserManagerMock.GetMock;

            userManager.GetUserId(TestUserId);

            var trainerService = TrainerServiceMock.GetMock;

            trainerService
            .IsTrainerForCourseAsync(true)
            .CourseHasEndedAsync(false);

            var controller = new TrainersController(
                userManager.Object,
                certificateService: null,
                courseService.Object,
                examService: null,
                trainerService.Object)
            {
                TempData = TempDataMock.GetMock
            };

            // Act
            var result = await controller.EvaluateExam(TestCourseId, It.IsAny <StudentCourseGradeFormModel>());

            // Assert
            controller.TempData.AssertErrorMsg(WebConstants.CourseHasNotEndedMsg);

            this.AssertRedirectToTrainersControllerStudents(result);

            courseService.Verify();
            trainerService.Verify();
            userManager.Verify();
        }
        public async Task Students_ShouldReturnRedirectToAction_GivenInvalidTrainer()
        {
            // Arrange
            var courseService = CourseServiceMock.GetMock;

            courseService.Exists(true);

            var userManager = UserManagerMock.GetMock;

            userManager.GetUserId(TestUserId);

            var trainerService = TrainerServiceMock.GetMock;

            trainerService.IsTrainerForCourseAsync(false);

            var controller = new TrainersController(
                userManager.Object,
                certificateService: null,
                courseService.Object,
                examService: null,
                trainerService.Object)
            {
                TempData = TempDataMock.GetMock
            };

            // Act
            var result = await controller.Students(TestCourseId);

            // Assert
            controller.TempData.AssertErrorMsg(WebConstants.NotTrainerForCourseMsg);

            this.AssertRedirectToTrainersControllerIndex(result);

            courseService.Verify();
            trainerService.Verify();
            userManager.Verify();
        }
        [InlineData(int.MaxValue)] // invalid
        public async Task Courses_ShouldReturnViewResultWithCorrectModel_GivenValidUser(int page)
        {
            // Arrange
            var testPagination = Tests.GetPaginationViewModel(page, TestTotalItems, TestSearchTerm);

            var userManager = UserManagerMock.GetMock;

            userManager.GetUserId(TestUserId);

            var trainerService = TrainerServiceMock.GetMock;

            trainerService
            .TotalCoursesAsync(TestTotalItems)
            .CoursesAsync(Tests.GetCourseServiceModelCollection())
            .CoursesToEvaluateAsync(Tests.GetCourseServiceModelCollection());

            var controller = new TrainersController(
                userManager.Object,
                certificateService: null,
                courseService: null,
                examService: null,
                trainerService.Object);

            // Act
            var result = await controller.Courses(TestSearchTerm, page);

            // Assert
            var viewResult = Assert.IsType <ViewResult>(result);
            var model      = Assert.IsType <TrainerCoursePageListingViewModel>(viewResult.Model);

            this.AssertCoursePage(testPagination, model);

            Tests.AssertCourseServiceModelCollection(model.CoursesToEvaluate);

            userManager.Verify();
            trainerService.Verify();
        }