public void UpdatePatientDetails_ReturnsNotFound_WhenRetrievalServiceReturnsNull()
        {
            // Arrange
            var expectedExaminationId = "expectedExaminationId";

            var examinationRetrievalService = new Mock <IAsyncQueryHandler <ExaminationRetrievalQuery, Examination> >();
            var patientDetailsUpdateService = new Mock <IAsyncQueryHandler <PatientDetailsUpdateQuery, Examination> >();

            examinationRetrievalService.Setup(service => service.Handle(It.IsAny <ExaminationRetrievalQuery>()))
            .Returns(Task.FromResult((Examination)null));

            Controller = new PatientDetailsController(
                LoggerMock.Object,
                Mapper,
                UsersRetrievalByOktaIdServiceMock.Object,
                AuthorizationServiceMock.Object,
                PermissionServiceMock.Object,
                examinationRetrievalService.Object,
                patientDetailsUpdateService.Object,
                _locationParentsQueryServiceMock.Object);

            var expectedPutPatientDetailsRequest = new PutPatientDetailsRequest();

            // Act
            var response = Controller.UpdatePatientDetails(expectedExaminationId, expectedPutPatientDetailsRequest).Result;

            // Assert
            var taskResult           = response.Should().BeOfType <ActionResult <PutPatientDetailsResponse> >().Subject;
            var notFoundObjectResult = taskResult.Result.Should().BeAssignableTo <NotFoundObjectResult>().Subject;

            notFoundObjectResult.Value.Should().BeAssignableTo <PutPatientDetailsResponse>();
        }
        public void UpdatePatientDetails_ReturnsBadRequest_WhenModelError()
        {
            // Arrange
            var expectedExaminationId = "expectedExaminationId";

            var examinationRetrievalService = new Mock <IAsyncQueryHandler <ExaminationRetrievalQuery, Examination> >();
            var patientDetailsUpdateService = new Mock <IAsyncQueryHandler <PatientDetailsUpdateQuery, Examination> >();

            Controller = new PatientDetailsController(
                LoggerMock.Object,
                Mapper,
                UsersRetrievalByOktaIdServiceMock.Object,
                AuthorizationServiceMock.Object,
                PermissionServiceMock.Object,
                examinationRetrievalService.Object,
                patientDetailsUpdateService.Object,
                _locationParentsQueryServiceMock.Object);

            Controller.ModelState.AddModelError("An", nameof(SystemValidationErrors.Duplicate));

            var expectedPutPatientDetailsRequest = new PutPatientDetailsRequest();

            // Act
            var response = Controller.UpdatePatientDetails(expectedExaminationId, expectedPutPatientDetailsRequest).Result;

            // Assert
            var taskResult             = response.Should().BeOfType <ActionResult <PutPatientDetailsResponse> >().Subject;
            var badRequestObjectResult = taskResult.Result.Should().BeAssignableTo <BadRequestObjectResult>().Subject;

            badRequestObjectResult.Value.Should().BeAssignableTo <PutPatientDetailsResponse>();
        }
        public void UpdatePatientDetails_ReturnsForbid_WhenNoPermissionAtNewMEOfficeLocation()
        {
            // Arrange
            AuthorizationServiceMock
            .SetupSequence(aus => aus.AuthorizeAsync(
                               It.IsAny <ClaimsPrincipal>(),
                               It.IsAny <ILocationPath>(),
                               It.IsAny <IEnumerable <IAuthorizationRequirement> >()))
            .Returns(Task.FromResult(AuthorizationResult.Success()))
            .Returns(Task.FromResult(AuthorizationResult.Failed()));
            var expectedExaminationId = "expectedExaminationId";
            var expectedExamination   = new Examination()
            {
                ExaminationId = expectedExaminationId,
            };

            var examinationRetrievalService = new Mock <IAsyncQueryHandler <ExaminationRetrievalQuery, Examination> >();
            var patientDetailsUpdateService = new Mock <IAsyncQueryHandler <PatientDetailsUpdateQuery, Examination> >();

            UsersRetrievalByOktaIdServiceMock
            .Setup(service => service.Handle(It.IsAny <UserRetrievalByOktaIdQuery>()))
            .Returns(Task.FromResult(AuthorizedUser));

            examinationRetrievalService
            .Setup(service => service.Handle(It.IsAny <ExaminationRetrievalQuery>()))
            .Returns(Task.FromResult(expectedExamination));

            patientDetailsUpdateService
            .Setup(pdus => pdus.Handle(It.IsAny <PatientDetailsUpdateQuery>()))
            .Returns(Task.FromResult(expectedExamination));

            Controller = new PatientDetailsController(
                LoggerMock.Object,
                Mapper,
                UsersRetrievalByOktaIdServiceMock.Object,
                AuthorizationServiceMock.Object,
                PermissionServiceMock.Object,
                examinationRetrievalService.Object,
                patientDetailsUpdateService.Object,
                _locationParentsQueryServiceMock.Object);

            Controller.ControllerContext = GetControllerContext();

            var expectedPutPatientDetailsRequest = new PutPatientDetailsRequest();

            // Act
            var response = Controller.UpdatePatientDetails(expectedExaminationId, expectedPutPatientDetailsRequest).Result;

            // Assert
            var taskResult = response.Should().BeOfType <ActionResult <PutPatientDetailsResponse> >().Subject;

            taskResult.Result.Should().BeAssignableTo <ForbidResult>();
        }
        public void UpdatePatientDetails_DoesNotReOpenCase_WhenCaseClosed()
        {
            // Arrange
            SetupAuthorize(AuthorizationResult.Success());
            var expectedExaminationId = "expectedExaminationId";
            var expectedExamination   = new Examination()
            {
                ExaminationId = expectedExaminationId,
                CaseCompleted = true,
            };

            var examinationRetrievalService = new Mock <IAsyncQueryHandler <ExaminationRetrievalQuery, Examination> >();
            var patientDetailsUpdateService = new Mock <IAsyncQueryHandler <PatientDetailsUpdateQuery, Examination> >();

            UsersRetrievalByOktaIdServiceMock
            .Setup(service => service.Handle(It.IsAny <UserRetrievalByOktaIdQuery>()))
            .Returns(Task.FromResult(AuthorizedUser));

            examinationRetrievalService
            .Setup(service => service.Handle(It.IsAny <ExaminationRetrievalQuery>()))
            .Returns(Task.FromResult(expectedExamination));

            patientDetailsUpdateService
            .Setup(pdus => pdus.Handle(It.IsAny <PatientDetailsUpdateQuery>()))
            .Returns(Task.FromResult(expectedExamination));

            Controller = new PatientDetailsController(
                LoggerMock.Object,
                Mapper,
                UsersRetrievalByOktaIdServiceMock.Object,
                AuthorizationServiceMock.Object,
                PermissionServiceMock.Object,
                examinationRetrievalService.Object,
                patientDetailsUpdateService.Object,
                _locationParentsQueryServiceMock.Object);

            Controller.ControllerContext = GetControllerContext();

            var expectedPutPatientDetailsRequest = new PutPatientDetailsRequest();

            // Act
            var response = Controller.UpdatePatientDetails(expectedExaminationId, expectedPutPatientDetailsRequest).Result;

            // Assert
            var taskResult          = response.Should().BeOfType <ActionResult <PutPatientDetailsResponse> >().Subject;
            var okObjectResult      = taskResult.Result.Should().BeAssignableTo <OkObjectResult>().Subject;
            var okObjectResultValue = okObjectResult.Value.Should().BeAssignableTo <PutPatientDetailsResponse>().Subject;

            okObjectResultValue.Header.Should().NotBeNull();
            expectedExamination.CaseCompleted.Should().BeTrue();
        }
Пример #5
0
        public async Task <ActionResult <PutPatientDetailsResponse> > UpdatePatientDetails(string examinationId,
                                                                                           [FromBody][ExaminationValidationModelBinderContext("examinationId")] PutPatientDetailsRequest putPatientDetailsRequest)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequestEnums(new PutPatientDetailsResponse()));
            }

            var examination =
                await _examinationRetrievalService.Handle(new ExaminationRetrievalQuery(examinationId, null));

            if (examination == null)
            {
                return(NotFound(new PutPatientDetailsResponse()));
            }

            // Do they have update permission on the examination being updated
            if (!CanAsync(Permission.UpdateExamination, examination))
            {
                return(Forbid());
            }

            var patientDetails = Mapper.Map <PatientDetails>(putPatientDetailsRequest);

            var locations = (await _locationParentsService.Handle(
                                 new LocationParentsQuery(patientDetails.MedicalExaminerOfficeResponsible))).ToList();

            var locationPath = new LocationPath();

            locationPath.UpdateLocationPath(locations);

            // Do they have permission at this location to update the examination. I.e. they're changing the Medical Examiner Office.
            if (!CanAsync(Permission.UpdateExamination, locationPath))
            {
                return(Forbid());
            }

            var myUser = await CurrentUser();

            var result = await _patientDetailsUpdateService.Handle(new PatientDetailsUpdateQuery(
                                                                       examinationId,
                                                                       patientDetails,
                                                                       myUser,
                                                                       locations));

            var patientCard = Mapper.Map <PatientCardItem>(result);

            return(Ok(new PutPatientDetailsResponse
            {
                Header = patientCard
            }));
        }