Search in sources :

Example 1 with MessageSourceService

use of org.openmrs.messagesource.MessageSourceService in project openmrs-core by openmrs.

the class AllergyValidatorTest method validate_shouldRejectADuplicateNonCodedAllergen.

/**
 * @see AllergyValidator#validate(Object, org.springframework.validation.Errors)
 */
@Test
public void validate_shouldRejectADuplicateNonCodedAllergen() {
    PowerMockito.mockStatic(Context.class);
    MessageSourceService ms = mock(MessageSourceService.class);
    when(Context.getMessageSourceService()).thenReturn(ms);
    Allergies allergies = new Allergies();
    Concept nonCodedConcept = createMockConcept(getOtherNonCodedConceptUuid());
    final String freeText = "some text";
    Allergen allergen1 = new Allergen(AllergenType.DRUG, nonCodedConcept, freeText);
    allergies.add(new Allergy(null, allergen1, null, null, null));
    when(ps.getAllergies(any(Patient.class))).thenReturn(allergies);
    Allergen duplicateAllergen = new Allergen(AllergenType.FOOD, nonCodedConcept, freeText);
    Allergy allergy = new Allergy(mock(Patient.class), duplicateAllergen, null, null, null);
    Errors errors = new BindException(allergy, "allergy");
    validator.validate(allergy, errors);
    assertTrue(errors.hasFieldErrors("allergen"));
    assertThat(errors.getFieldError("allergen").getCode(), is("allergyapi.message.duplicateAllergen"));
}
Also used : Concept(org.openmrs.Concept) Allergy(org.openmrs.Allergy) Errors(org.springframework.validation.Errors) MessageSourceService(org.openmrs.messagesource.MessageSourceService) Patient(org.openmrs.Patient) BindException(org.springframework.validation.BindException) Allergies(org.openmrs.Allergies) Allergen(org.openmrs.Allergen) PrepareForTest(org.powermock.core.classloader.annotations.PrepareForTest) Test(org.junit.Test)

Example 2 with MessageSourceService

use of org.openmrs.messagesource.MessageSourceService in project openmrs-core by openmrs.

the class AllergyValidatorTest method validate_shouldRejectADuplicateAllergen.

/**
 * @see AllergyValidator#validate(Object, org.springframework.validation.Errors)
 */
@Test
public void validate_shouldRejectADuplicateAllergen() {
    PowerMockito.mockStatic(Context.class);
    MessageSourceService ms = mock(MessageSourceService.class);
    when(Context.getMessageSourceService()).thenReturn(ms);
    Allergies allergies = new Allergies();
    Concept aspirin = createMockConcept();
    Allergen allergen1 = new Allergen(AllergenType.DRUG, aspirin, null);
    allergies.add(new Allergy(null, allergen1, null, null, null));
    when(ps.getAllergies(any(Patient.class))).thenReturn(allergies);
    Allergen duplicateAllergen = new Allergen(AllergenType.FOOD, aspirin, null);
    Allergy allergy = new Allergy(mock(Patient.class), duplicateAllergen, null, null, null);
    Errors errors = new BindException(allergy, "allergy");
    validator.validate(allergy, errors);
    assertTrue(errors.hasFieldErrors("allergen"));
    assertThat(errors.getFieldError("allergen").getCode(), is("allergyapi.message.duplicateAllergen"));
}
Also used : Concept(org.openmrs.Concept) Allergy(org.openmrs.Allergy) Errors(org.springframework.validation.Errors) MessageSourceService(org.openmrs.messagesource.MessageSourceService) Patient(org.openmrs.Patient) BindException(org.springframework.validation.BindException) Allergies(org.openmrs.Allergies) Allergen(org.openmrs.Allergen) PrepareForTest(org.powermock.core.classloader.annotations.PrepareForTest) Test(org.junit.Test)

Example 3 with MessageSourceService

use of org.openmrs.messagesource.MessageSourceService in project openmrs-core by openmrs.

the class PatientProgramValidator method validate.

/**
 * Validates the given PatientProgram.
 *
 * @param obj The patient program to validate.
 * @param errors Errors
 * @see org.springframework.validation.Validator#validate(java.lang.Object,
 *      org.springframework.validation.Errors)
 * @should fail validation if obj is null
 * @should fail if the patient field is blank
 * @should fail if there is more than one patientState with the same states and startDates
 * @should fail if there is more than one state with a null start date in the same workflow
 * @should pass if the start date of the first patient state in the work flow is null
 * @should fail if any patient state has an end date before its start date
 * @should fail if the program property is null
 * @should fail if any patient states overlap each other in the same work flow
 * @should fail if a patientState has an invalid work flow state
 * @should fail if a patient program has duplicate states in the same work flow
 * @should fail if a patient is in multiple states in the same work flow
 * @should fail if a enrolled date is in future at the date it set
 * @should fail if a completion date is in future at the date it set
 * @should fail if a patient program has an enroll date after its completion
 * @should pass if a patient is in multiple states in different work flows
 * @should pass for a valid program
 * @should pass for patient states that have the same start dates in the same work flow
 * @should pass validation if field lengths are correct
 * @should fail validation if field lengths are not correct
 */
@Override
public void validate(Object obj, Errors errors) {
    if (log.isDebugEnabled()) {
        log.debug(this.getClass().getName() + ".validate...");
    }
    if (obj == null) {
        throw new IllegalArgumentException("The parameter obj should not be null");
    }
    MessageSourceService mss = Context.getMessageSourceService();
    PatientProgram patientProgram = (PatientProgram) obj;
    ValidationUtils.rejectIfEmpty(errors, "patient", "error.required", new Object[] { mss.getMessage("general.patient") });
    ValidationUtils.rejectIfEmpty(errors, "program", "error.required", new Object[] { mss.getMessage("Program.program") });
    if (errors.hasErrors()) {
        return;
    }
    ValidationUtils.rejectIfEmpty(errors, "dateEnrolled", "error.patientProgram.enrolledDateEmpty");
    Date today = new Date();
    if (patientProgram.getDateEnrolled() != null && today.before(patientProgram.getDateEnrolled())) {
        errors.rejectValue("dateEnrolled", "error.patientProgram.enrolledDateDateCannotBeInFuture");
    }
    if (patientProgram.getDateCompleted() != null && today.before(patientProgram.getDateCompleted())) {
        errors.rejectValue("dateCompleted", "error.patientProgram.completionDateCannotBeInFuture");
    }
    // if enrollment or complete date of program is in future or complete date has come before enroll date we should throw error
    if (patientProgram.getDateEnrolled() != null && OpenmrsUtil.compareWithNullAsLatest(patientProgram.getDateCompleted(), patientProgram.getDateEnrolled()) < 0) {
        errors.rejectValue("dateCompleted", "error.patientProgram.enrolledDateShouldBeBeforecompletionDate");
    }
    Set<ProgramWorkflow> workFlows = patientProgram.getProgram().getWorkflows();
    // Patient state validation is specific to a work flow
    for (ProgramWorkflow workFlow : workFlows) {
        Set<PatientState> patientStates = patientProgram.getStates();
        if (patientStates != null) {
            // Set to store to keep track of unique valid state and start date combinations
            Set<String> statesAndStartDates = new HashSet<>();
            PatientState latestState = null;
            boolean foundCurrentPatientState = false;
            boolean foundStateWithNullStartDate = false;
            for (PatientState patientState : patientStates) {
                if (patientState.getVoided()) {
                    continue;
                }
                String missingRequiredFieldCode = null;
                // only the initial state can have a null start date
                if (patientState.getStartDate() == null) {
                    if (foundStateWithNullStartDate) {
                        missingRequiredFieldCode = "general.dateStart";
                    } else {
                        foundStateWithNullStartDate = true;
                    }
                } else if (patientState.getState() == null) {
                    missingRequiredFieldCode = "State.state";
                }
                if (missingRequiredFieldCode != null) {
                    errors.rejectValue("states", "PatientState.error.requiredField", new Object[] { mss.getMessage(missingRequiredFieldCode) }, null);
                    return;
                }
                // state should belong to one of the workflows in the program
                // note that we are iterating over getAllWorkflows() here because we want to include
                // retired workflows, and the workflows variable does not include retired workflows
                boolean isValidPatientState = false;
                for (ProgramWorkflow wf : patientProgram.getProgram().getAllWorkflows()) {
                    if (wf.getStates().contains(patientState.getState())) {
                        isValidPatientState = true;
                        break;
                    }
                }
                if (!isValidPatientState) {
                    errors.rejectValue("states", "PatientState.error.invalidPatientState", new Object[] { patientState }, null);
                    return;
                }
                // will validate it with other states in its workflow
                if (!patientState.getState().getProgramWorkflow().equals(workFlow)) {
                    continue;
                }
                if (OpenmrsUtil.compareWithNullAsLatest(patientState.getEndDate(), patientState.getStartDate()) < 0) {
                    errors.rejectValue("states", "PatientState.error.endDateCannotBeBeforeStartDate");
                    return;
                } else if (statesAndStartDates.contains(patientState.getState().getUuid() + "" + patientState.getStartDate())) {
                    // we already have a patient state with the same work flow state and start date
                    errors.rejectValue("states", "PatientState.error.duplicatePatientStates");
                    return;
                }
                // Ensure that the patient is only in one state at a given time
                if (!foundCurrentPatientState && patientState.getEndDate() == null) {
                    foundCurrentPatientState = true;
                } else if (foundCurrentPatientState && patientState.getEndDate() == null) {
                    errors.rejectValue("states", "PatientProgram.error.cannotBeInMultipleStates");
                    return;
                }
                if (latestState == null) {
                    latestState = patientState;
                } else {
                    if (patientState.compareTo(latestState) > 0) {
                        // patient should have already left this state since it is older
                        if (latestState.getEndDate() == null) {
                            errors.rejectValue("states", "PatientProgram.error.cannotBeInMultipleStates");
                            return;
                        } else if (OpenmrsUtil.compareWithNullAsEarliest(patientState.getStartDate(), latestState.getEndDate()) < 0) {
                            // current state was started before a previous state was ended
                            errors.rejectValue("states", "PatientProgram.error.foundOverlappingStates", new Object[] { patientState.getStartDate(), latestState.getEndDate() }, null);
                            return;
                        }
                        latestState = patientState;
                    } else if (patientState.compareTo(latestState) < 0) {
                        // patient should have already left this state since it is older
                        if (patientState.getEndDate() == null) {
                            errors.rejectValue("states", "PatientProgram.error.cannotBeInMultipleStates");
                            return;
                        } else if (OpenmrsUtil.compareWithNullAsEarliest(latestState.getStartDate(), patientState.getEndDate()) < 0) {
                            // latest state was started before a previous state was ended
                            errors.rejectValue("states", "PatientProgram.error.foundOverlappingStates");
                            return;
                        }
                    }
                }
                statesAndStartDates.add(patientState.getState().getUuid() + "" + patientState.getStartDate());
            }
        }
    }
    ValidateUtil.validateFieldLengths(errors, obj.getClass(), "voidReason");
// 
}
Also used : ProgramWorkflow(org.openmrs.ProgramWorkflow) MessageSourceService(org.openmrs.messagesource.MessageSourceService) PatientProgram(org.openmrs.PatientProgram) Date(java.util.Date) PatientState(org.openmrs.PatientState) HashSet(java.util.HashSet)

Aggregations

MessageSourceService (org.openmrs.messagesource.MessageSourceService)3 Test (org.junit.Test)2 Allergen (org.openmrs.Allergen)2 Allergies (org.openmrs.Allergies)2 Allergy (org.openmrs.Allergy)2 Concept (org.openmrs.Concept)2 Patient (org.openmrs.Patient)2 PrepareForTest (org.powermock.core.classloader.annotations.PrepareForTest)2 BindException (org.springframework.validation.BindException)2 Errors (org.springframework.validation.Errors)2 Date (java.util.Date)1 HashSet (java.util.HashSet)1 PatientProgram (org.openmrs.PatientProgram)1 PatientState (org.openmrs.PatientState)1 ProgramWorkflow (org.openmrs.ProgramWorkflow)1