/**
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
* the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
*
* Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
* graphic logo is a trademark of OpenMRS Inc.
*/
package org.openmrs.api.db.hibernate;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import java.util.List;
import java.util.Locale;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openmrs.Concept;
import org.openmrs.ConceptAttributeType;
import org.openmrs.ConceptClass;
import org.openmrs.ConceptDatatype;
import org.openmrs.ConceptName;
import org.openmrs.Drug;
import org.openmrs.api.ConceptNameType;
import org.openmrs.api.context.Context;
import org.openmrs.test.BaseContextSensitiveTest;
import org.springframework.beans.factory.annotation.Autowired;
public class HibernateConceptDAOTest extends BaseContextSensitiveTest {
private static final String PROVIDERS_INITIAL_XML = "org/openmrs/api/db/hibernate/include/HibernateConceptTestDataSet.xml";
protected static final String CONCEPT_ATTRIBUTE_TYPE_XML = "org/openmrs/api/include/ConceptServiceTest-conceptAttributeType.xml";
@Autowired
private HibernateConceptDAO dao;
@Before
public void setUp() {
executeDataSet(PROVIDERS_INITIAL_XML);
updateSearchIndex();
}
/**
* @see HibernateConceptDAO#getDrugs(String,Concept,boolean,boolean,boolean,Integer,Integer)
*/
@Test
public void getDrugs_shouldReturnDrugIf_eitherDrugNameOrConceptNameMatchesThePhaseNotBoth() {
Concept concept = dao.getConcept(3);
// concept has "COUGH SYRUP" as a concept_name and also Drug has
// Drug_name as "COUGH" so return two distinct drugs that means search
// either drug name or concept name match the phase
List<Drug> drugList = dao.getDrugs("COUGH", concept, true, true, false, 0, 10);
Assert.assertEquals(2, drugList.size());
}
/**
* @see HibernateConceptDAO#getDrugs(String,Concept,boolean,boolean,boolean,Integer,Integer)
*/
@Test
public void getDrugs_shouldReturnDistinctDrugs() {
Concept concept1 = dao.getConcept(14);
List<Drug> drugList = dao.getDrugs("TEST_DRUG", concept1, true, true, false, 0, 10);
Assert.assertEquals(1, drugList.size());
}
/**
* @see HibernateConceptDAO#getDrugs(String,Concept,boolean)
*/
@Test
public void getDrugs_shouldReturnDrugIf_EitherDrugNameIsUpperOrLowerCase() {
List<Drug> drugList1 = dao.getDrugs("Triomune-30", null, true);
Assert.assertEquals(1, drugList1.size());
List<Drug> drugList2 = dao.getDrugs("triomune-30", null, true);
Assert.assertEquals(1, drugList2.size());
}
/**
* @see HibernateConceptDAO#getDrugs(String,Concept,boolean,boolean,boolean,Integer,Integer)
*/
@Test
public void getDrugs_shouldReturnDrugIfPhraseMatchDrugNameNoNeedToMatchBothConceptNameAndDrugName() {
// This concept does not contain concept_name with "Triomune"
Concept concept2 = dao.getConcept(3);
// In this test there is no any concept_name match with "Triomune" but
// Drug name match with "Trimonue" so no need to match both drug_name
// and the concept_name to find drug
List<Drug> drugList = dao.getDrugs("Triomune", concept2, true, true, false, 0, 10);
Assert.assertEquals(1, drugList.size());
}
/**
* @see HibernateConceptDAO#getDrugs(String,Concept,boolean,boolean,boolean,Integer,Integer)
*/
@Test
public void getDrugs_shouldReturnDrugIfPhaseMatchConceptNameNoNeedToMatchBothConceptNameAndDrugName() {
Concept concept4 = dao.getConcept(7);
//In this test, there is no any drug_name with "VOIDED" but concept_name
//match with "VOIDED" so this prove no need to match both drug_name and the
//concept_name
List<Drug> drugList = dao.getDrugs("VOIDED", concept4, true, true, false, 0, 10);
Assert.assertEquals(1, drugList.size());
}
/**
* @see HibernateConceptDAO#getDrugs(String,Concept,boolean,boolean,boolean,Integer,Integer)
*/
@Test
public void getDrugs_shouldReturnDrugWhenPhraseMatchDrugNameEvenSerchDrugConceeptNameIsfalse() {
List<Drug> drugList = dao.getDrugs("Triomune-30", null, true, false, false, 0, 10);
Assert.assertEquals(1, drugList.size());
}
/**
* @see HibernateConceptDAO#getDrugs(String)
*/
@Test
public void getDrugs_shouldNotReturnRetired() {
List<Drug> drugList = dao.getDrugs("TEST_DRUG_NAME_RETIRED");
Assert.assertEquals(0, drugList.size());
}
/**
* @see HibernateConceptDAO#getDrugs(String)
*/
@Test
public void getDrugs_shouldReturnNonRetired() {
List<Drug> drugList = dao.getDrugs("TEST_DRUG_NAME");
Assert.assertEquals(1, drugList.size());
}
@Test
public void getDrugs_shouldReturnDrugEvenIf_DrugNameHasSpecialCharacters() {
List<Drug> drugList1 = dao.getDrugs("DRUG_NAME_WITH_SPECIAL_CHARACTERS (", null, true);
Assert.assertEquals(1, drugList1.size());
}
/**
* @see HibernateConceptDAO#getConceptAttributeCount(ConceptAttributeType)
*/
@Test
public void shouldGetConceptAttributeCountForAttributeType() {
executeDataSet(CONCEPT_ATTRIBUTE_TYPE_XML);
ConceptAttributeType conceptAttributeType = Context.getConceptService().getConceptAttributeType(1);
Assert.assertEquals(1, dao.getConceptAttributeCount(conceptAttributeType));
Assert.assertEquals(0, dao.getConceptAttributeCount(null));
}
@Test //TRUNK-4967
public void isConceptNameDuplicate_shouldNotFailIfConceptDoesNotHaveADefaultNameForLocale() {
//given
ConceptClass diagnosis = dao.getConceptClasses("Diagnosis").get(0);
ConceptDatatype na = dao.getConceptDatatypeByName("N/A");
Concept tuberculosis = new Concept();
tuberculosis.addName(new ConceptName("Tuberculosis", Locale.US));
tuberculosis.setDatatype(na);
tuberculosis.setConceptClass(diagnosis);
dao.saveConcept(tuberculosis);
ConceptName shortName = new ConceptName("TB", Locale.FRANCE);
shortName.setConceptNameType(ConceptNameType.SHORT);
tuberculosis.addName(shortName);
//when
boolean duplicate = dao.isConceptNameDuplicate(shortName);
//then
//no NPE exception thrown
assertThat(duplicate, is(false));
}
}