public IActionResult EditDelegateCourseAdminField(
            EditDelegateCourseAdminFieldFormData formData,
            int promptNumber,
            int progressId,
            DelegateAccessRoute accessedVia
            )
        {
            if (!ModelState.IsValid)
            {
                var delegateCourseProgress =
                    progressService.GetDetailedCourseProgress(progressId);

                var model = new EditDelegateCourseAdminFieldViewModel(
                    formData,
                    delegateCourseProgress !,
                    progressId,
                    promptNumber,
                    accessedVia
                    );
                return(View(model));
            }

            progressService.UpdateCourseAdminFieldForDelegate(progressId, promptNumber, formData.Answer?.Trim());

            return(RedirectToPreviousPage(formData.DelegateId, formData.CustomisationId, accessedVia, formData.ReturnPageQuery));
        }
        public void EditDelegateCourseAdminField_POST_calls_service_and_redirects_to_correct_action(
            DelegateAccessRoute accessedVia,
            string expectedController,
            string expectedAction
            )
        {
            // Given
            const int    promptNumber = 1;
            const string answer       = "Test Answer";
            var          formData     = new EditDelegateCourseAdminFieldFormData
            {
                Answer          = answer,
                ReturnPageQuery = ReturnPageQueryHelper.GetDefaultReturnPageQuery(itemIdToReturnTo: CardId),
            };

            A.CallTo(() => progressService.UpdateCourseAdminFieldForDelegate(A <int> ._, A <int> ._, A <string> ._))
            .DoesNothing();

            // When
            var result = delegateProgressController.EditDelegateCourseAdminField(
                formData,
                promptNumber,
                ProgressId,
                accessedVia
                );

            // Then
            A.CallTo(() => progressService.UpdateCourseAdminFieldForDelegate(ProgressId, promptNumber, answer))
            .MustHaveHappenedOnceExactly();
            var expectedFragment = accessedVia.Equals(DelegateAccessRoute.CourseDelegates) ? CardId : null;

            result.Should().BeRedirectToActionResult().WithControllerName(expectedController)
            .WithActionName(expectedAction).WithFragment(expectedFragment);
        }
        public void EditDelegateCourseAdminField_POST_does_not_call_service_with_invalid_model()
        {
            // Given
            const int    promptNumber = 1;
            const string answer       = "Test Answer";

            var delegateCourseInfo = new DelegateCourseInfo
            {
                CourseAdminFields = new List <CourseAdminFieldWithAnswer>
                {
                    new CourseAdminFieldWithAnswer(promptNumber, "Prompt text", "Answer", null)
                },
            };

            var delegateCourseDetails = new DetailedCourseProgress(
                new Progress(),
                new List <DetailedSectionProgress>(),
                delegateCourseInfo
                );

            var formData = new EditDelegateCourseAdminFieldFormData {
                Answer = answer
            };

            A.CallTo(() => progressService.GetDetailedCourseProgress(ProgressId))
            .Returns(delegateCourseDetails);
            delegateProgressController.ModelState.AddModelError("Answer", "Test error message");

            // When
            var result = delegateProgressController.EditDelegateCourseAdminField(
                formData,
                promptNumber,
                ProgressId,
                DelegateAccessRoute.CourseDelegates
                );

            // Then
            A.CallTo(() => progressService.UpdateCourseAdminFieldForDelegate(A <int> ._, A <int> ._, A <string> ._))
            .MustNotHaveHappened();
            result.Should().BeViewResult().ModelAs <EditDelegateCourseAdminFieldViewModel>();
        }