def test_a_preferred_name_can_not_be_an_index_search_term(self): source = SourceFactory(custom_validation_schema=CUSTOM_VALIDATION_SCHEMA_OPENMRS, version=HEAD) concept = Concept.persist_new( dict( mnemonic='concept', version=HEAD, name='concept', parent=source, concept_class='Diagnosis', datatype='None', names=[ LocalizedTextFactory.build(name="IndexTermName", locale_preferred=True, type=INDEX_TERM), LocalizedTextFactory.build(name='Fully Specified Name'), ] ) ) self.assertEqual( concept.errors, dict(names=[OPENMRS_SHORT_NAME_CANNOT_BE_PREFERRED + ': IndexTermName (locale: en, preferred: yes)']) )
def test_a_name_can_be_equal_to_a_short_name(self): source = SourceFactory(custom_validation_schema=CUSTOM_VALIDATION_SCHEMA_OPENMRS, version=HEAD) concept = Concept.persist_new( dict( mnemonic='concept', version=HEAD, name='concept', parent=source, concept_class='Diagnosis', datatype='None', names=[ LocalizedTextFactory.build(name="aName", type=SHORT), LocalizedTextFactory.build(name='aName'), ] ) ) self.assertEqual(concept.errors, {}) self.assertIsNotNone(concept.id)
def test_name_locale_is_valid_attribute_negative(self): source = SourceFactory(custom_validation_schema=CUSTOM_VALIDATION_SCHEMA_OPENMRS) concept = Concept.persist_new( dict( mnemonic='concept1', version=HEAD, name='concept1', parent=source, concept_class='Diagnosis', datatype='None', names=[LocalizedTextFactory.build(locale_preferred=True, locale='FOOBAR')], descriptions=[LocalizedTextFactory.build(locale_preferred=True)] ) ) self.assertEqual( concept.errors, dict(names=[OPENMRS_NAME_LOCALE]) )
def test_at_least_one_fully_specified_name_per_concept_negative(self): source = SourceFactory(custom_validation_schema=CUSTOM_VALIDATION_SCHEMA_OPENMRS, version=HEAD) concept = Concept.persist_new( dict( mnemonic='concept', version=HEAD, name='concept', parent=source, concept_class='Diagnosis', datatype='None', names=[ LocalizedTextFactory.build(name='Fully Specified Name 1', locale='tr', type='Short'), LocalizedTextFactory.build(name='Fully Specified Name 2', locale='en', type='Short') ] ) ) self.assertEqual( concept.errors, dict(names=[OPENMRS_AT_LEAST_ONE_FULLY_SPECIFIED_NAME]) )
def test_a_name_should_be_unique(self): source = SourceFactory(custom_validation_schema=CUSTOM_VALIDATION_SCHEMA_OPENMRS, version=HEAD) concept = Concept.persist_new( dict( mnemonic='concept', version=HEAD, name='concept', parent=source, concept_class='Diagnosis', datatype='None', names=[ LocalizedTextFactory.build(name="aName"), LocalizedTextFactory.build(name='aName'), ] ) ) self.assertEqual( concept.errors, dict(names=[OPENMRS_NAMES_EXCEPT_SHORT_MUST_BE_UNIQUE]) )
def test_concept_should_have_exactly_one_preferred_name_per_locale(self): name_en1 = LocalizedTextFactory.build(name='PreferredName1', locale_preferred=True) name_en2 = LocalizedTextFactory.build(name='PreferredName2', locale_preferred=True) name_tr = LocalizedTextFactory.build(name='PreferredName3', locale="tr", locale_preferred=True) source = SourceFactory(custom_validation_schema=CUSTOM_VALIDATION_SCHEMA_OPENMRS) concept = Concept.persist_new( dict( mnemonic='concept', version=HEAD, name='concept', parent=source, concept_class='Diagnosis', datatype='None', names=[name_en1, name_en2, name_tr] ) ) self.assertEqual( concept.errors, dict(names=[OPENMRS_MUST_HAVE_EXACTLY_ONE_PREFERRED_NAME + ': PreferredName2 (locale: en, preferred: yes)']) )
def test_source_active_inactive_should_affect_children(self): source = SourceFactory(is_active=True) concept = ConceptFactory(parent=source, is_active=True) source.is_active = False source.save() concept.refresh_from_db() self.assertFalse(source.is_active) self.assertFalse(concept.is_active) source.is_active = True source.save() concept.refresh_from_db() self.assertTrue(source.is_active) self.assertTrue(concept.is_active)
def test_add_references(self): collection = CollectionFactory() self.assertEqual(collection.concepts.count(), 0) self.assertEqual(collection.references.count(), 0) source = SourceFactory() concept = ConceptFactory(parent=source, sources=[source]) concept_expression = concept.uri collection.add_references([concept_expression]) self.assertEqual(collection.concepts.count(), 1) self.assertEqual(collection.references.count(), 1) self.assertEqual(collection.references.first().expression, concept_expression) self.assertEqual(collection.concepts.first(), concept)
def test_source_version_delete(self): source = SourceFactory(version=HEAD) concept = ConceptFactory(mnemonic='concept1', version=HEAD, sources=[source], parent=source) self.assertTrue(source.is_latest_version) self.assertEqual(concept.sources.count(), 1) version1 = SourceFactory.build(name='version1', version='v1', mnemonic=source.mnemonic, organization=source.organization) Source.persist_new_version(version1, source.created_by) source.refresh_from_db() self.assertEqual(concept.sources.count(), 2) self.assertTrue(version1.is_latest_version) self.assertFalse(source.is_latest_version) source_versions = Source.objects.filter( mnemonic=source.mnemonic, version='v1', ) self.assertTrue(source_versions.exists()) self.assertEqual(version1.concepts.count(), 1) version1.delete() source.refresh_from_db() self.assertFalse( Source.objects.filter( version='v1', mnemonic=source.mnemonic, ).exists()) self.assertTrue(source.is_latest_version) self.assertEqual(concept.sources.count(), 1) with self.assertRaises(ValidationError) as ex: source.delete() self.assertEqual(ex.exception.message_dict, { 'detail': ['Cannot delete only version.'], })
def test_no_more_than_one_short_name_per_locale(self): source = SourceFactory(custom_validation_schema=CUSTOM_VALIDATION_SCHEMA_OPENMRS, version=HEAD) concept = Concept.persist_new( dict( mnemonic='concept', version=HEAD, name='concept', parent=source, concept_class='Diagnosis', datatype='None', names=[ LocalizedTextFactory.build(name="fully specified name1", locale='en', type='Short'), LocalizedTextFactory.build(name='fully specified name2', locale='en', type='Short'), LocalizedTextFactory.build(name='fully specified name3', locale='fr'), ] ) ) self.assertEqual( concept.errors, dict(names=[OPENMRS_NO_MORE_THAN_ONE_SHORT_NAME_PER_LOCALE + ': fully specified name2 (locale: en, preferred: no)']) )
def test_persist_new(self): source = SourceFactory(version=HEAD) concept = Concept.persist_new({ **factory.build(dict, FACTORY_CLASS=ConceptFactory), 'mnemonic': 'c1', 'parent': source, 'names': [LocalizedTextFactory.build(locale='en', name='English', locale_preferred=True)] }) self.assertEqual(concept.errors, {}) self.assertIsNotNone(concept.id) self.assertEqual(concept.version, str(concept.id)) self.assertEqual(source.concepts_set.count(), 1) self.assertEqual(source.concepts.count(), 1) self.assertEqual( concept.uri, '/orgs/{}/sources/{}/concepts/{}/{}/'.format( source.organization.mnemonic, source.mnemonic, concept.mnemonic, concept.id ) )
def test_persist_new(self): source = SourceFactory(version=HEAD) concept1 = ConceptFactory(parent=source) concept2 = ConceptFactory(parent=source) mapping = Mapping.persist_new({ **factory.build(dict, FACTORY_CLASS=MappingFactory), 'from_concept': concept1, 'to_concept': concept2, 'parent_id': source.id }, source.created_by) self.assertEqual(mapping.errors, {}) self.assertIsNotNone(mapping.id) self.assertEqual(mapping.version, str(mapping.id)) self.assertEqual(source.mappings_set.count(), 1) self.assertEqual(source.mappings.count(), 1) self.assertEqual( mapping.uri, '/orgs/{}/sources/{}/mappings/{}/{}/'.format( source.organization.mnemonic, source.mnemonic, mapping.mnemonic, mapping.id ) )
def test_concepts_should_have_unique_fully_specified_name_per_locale(self): name_fully_specified1 = LocalizedTextFactory.build(name='FullySpecifiedName1') source = SourceFactory(custom_validation_schema=CUSTOM_VALIDATION_SCHEMA_OPENMRS, version=HEAD) concept1_data = { **factory.build(dict, FACTORY_CLASS=ConceptFactory), 'mnemonic': 'c1', 'parent': source, 'names': [name_fully_specified1] } concept2_data = { **factory.build(dict, FACTORY_CLASS=ConceptFactory), 'mnemonic': 'c2', 'parent': source, 'names': [name_fully_specified1] } concept1 = Concept.persist_new(concept1_data) concept2 = Concept.persist_new(concept2_data) self.assertEqual(concept1.errors, {}) self.assertEqual( concept2.errors, dict(names=[OPENMRS_FULLY_SPECIFIED_NAME_UNIQUE_PER_SOURCE_LOCALE + ': FullySpecifiedName1 (locale: en, preferred: no)']) )
def test_user_active_inactive_should_affect_children(self): user = UserProfileFactory(is_active=True) source = SourceFactory(user=user, is_active=True) collection = CollectionFactory(user=user, is_active=True) user.is_active = False user.save() source.refresh_from_db() collection.refresh_from_db() self.assertFalse(user.is_active) self.assertFalse(source.is_active) self.assertFalse(collection.is_active) user.is_active = True user.save() source.refresh_from_db() collection.refresh_from_db() self.assertTrue(user.is_active) self.assertTrue(source.is_active) self.assertTrue(collection.is_active)
def test_persist_new_version(self): source = SourceFactory(version=HEAD) concept = ConceptFactory(mnemonic='concept1', parent=source) self.assertEqual(source.concepts_set.count(), 1) # parent-child self.assertEqual(source.concepts.count(), 1) self.assertEqual(concept.sources.count(), 1) self.assertTrue(source.is_latest_version) version1 = SourceFactory.build(name='version1', version='v1', mnemonic=source.mnemonic, organization=source.organization) Source.persist_new_version(version1, source.created_by) source.refresh_from_db() self.assertFalse(source.is_latest_version) self.assertEqual(source.concepts_set.count(), 1) # parent-child self.assertEqual(source.concepts.count(), 1) self.assertTrue(version1.is_latest_version) self.assertEqual(version1.concepts.count(), 1) self.assertEqual(version1.concepts_set.count(), 0) # no direct child
def test_specifier_should_initialize_openmrs_validator_with_reference_values(self): source = SourceFactory(custom_validation_schema=CUSTOM_VALIDATION_SCHEMA_OPENMRS, version=HEAD) expected_reference_values = { 'DescriptionTypes': ['None', 'FULLY_SPECIFIED', 'Definition'], 'Datatypes': ['None', 'N/A', 'Numeric', 'Coded', 'Text'], 'Classes': ['Diagnosis', 'Drug', 'Test', 'Procedure'], 'Locales': ['en', 'es', 'fr', 'tr', 'Abkhazian', 'English'], 'NameTypes': ['FULLY_SPECIFIED', 'Fully Specified', 'Short', 'SHORT', 'INDEX_TERM', 'Index Term', 'None']} validator = ValidatorSpecifier().with_validation_schema( CUSTOM_VALIDATION_SCHEMA_OPENMRS ).with_repo(source).with_reference_values().get() actual_reference_values = validator.reference_values self.assertEqual(sorted(expected_reference_values['Datatypes']), sorted(actual_reference_values['Datatypes'])) self.assertEqual(sorted(expected_reference_values['Classes']), sorted(actual_reference_values['Classes'])) self.assertEqual(sorted(expected_reference_values['Locales']), sorted(actual_reference_values['Locales'])) self.assertEqual(sorted(expected_reference_values['NameTypes']), sorted(actual_reference_values['NameTypes'])) self.assertEqual( sorted(expected_reference_values['DescriptionTypes']), sorted(actual_reference_values['DescriptionTypes']) )
def test_org_active_inactive_should_affect_children(self): org = OrganizationFactory(is_active=True) source = SourceFactory(organization=org, is_active=True) collection = CollectionFactory(organization=org, is_active=True) org.is_active = False org.save() source.refresh_from_db() collection.refresh_from_db() self.assertFalse(org.is_active) self.assertFalse(source.is_active) self.assertFalse(collection.is_active) org.is_active = True org.save() source.refresh_from_db() collection.refresh_from_db() self.assertTrue(org.is_active) self.assertTrue(source.is_active) self.assertTrue(collection.is_active)
def test_seed_concepts(self): collection1 = CollectionFactory() collection2 = CollectionFactory(version='v1', mnemonic=collection1.mnemonic, organization=collection1.organization) self.assertTrue(collection1.is_head) self.assertFalse(collection2.is_head) source = SourceFactory() concept = ConceptFactory(parent=source, sources=[source]) concept_expression = concept.uri collection1.add_references([concept_expression]) self.assertEqual(collection1.concepts.count(), 1) self.assertEqual(collection2.concepts.count(), 0) collection2.seed_concepts() self.assertEqual(collection1.concepts.count(), 1) self.assertEqual(collection2.concepts.count(), 1)
def test_unique_preferred_name_per_locale_within_concept_negative(self): source = SourceFactory(custom_validation_schema=CUSTOM_VALIDATION_SCHEMA_OPENMRS, version=HEAD) concept = Concept.persist_new( dict( mnemonic='concept1', version=HEAD, name='concept1', parent=source, concept_class='Diagnosis', datatype='None', names=[ LocalizedTextFactory.build( name='Concept Non Unique Preferred Name', locale='es', locale_preferred=True, type='FULLY_SPECIFIED' ), LocalizedTextFactory.build( name='Concept Non Unique Preferred Name', locale='es', locale_preferred=True, type='FULLY_SPECIFIED' ), ] ) ) self.assertEqual( concept.errors, {'names': ['A concept may not have more than one preferred name (per locale): ' 'Concept Non Unique Preferred Name (locale: es, preferred: yes)']} )
def create_lookup_concept_classes(user=None, org=None): from core.sources.tests.factories import SourceFactory from core.concepts.tests.factories import LocalizedTextFactory, ConceptFactory org = org or Organization.objects.get(mnemonic='OCL') user = user or UserProfile.objects.get(username='******') classes_source = SourceFactory(updated_by=user, organization=org, mnemonic="Classes", version=HEAD) datatypes_source = SourceFactory(updated_by=user, organization=org, mnemonic="Datatypes", version=HEAD) nametypes_source = SourceFactory(updated_by=user, organization=org, mnemonic="NameTypes", version=HEAD) descriptiontypes_source = SourceFactory( updated_by=user, organization=org, mnemonic="DescriptionTypes", version=HEAD ) maptypes_source = SourceFactory(updated_by=user, organization=org, mnemonic="MapTypes", version=HEAD) locales_source = SourceFactory(updated_by=user, organization=org, mnemonic="Locales", version=HEAD) ConceptFactory( version=HEAD, updated_by=user, parent=classes_source, concept_class="Concept Class", names=[LocalizedTextFactory(name="Diagnosis")] ) ConceptFactory( version=HEAD, updated_by=user, parent=classes_source, concept_class="Concept Class", names=[LocalizedTextFactory(name="Drug")] ) ConceptFactory( version=HEAD, updated_by=user, parent=classes_source, concept_class="Concept Class", names=[LocalizedTextFactory(name="Test")] ) ConceptFactory( version=HEAD, updated_by=user, parent=classes_source, concept_class="Concept Class", names=[LocalizedTextFactory(name="Procedure")] ) ConceptFactory( version=HEAD, updated_by=user, parent=datatypes_source, concept_class="Datatype", names=[LocalizedTextFactory(name="None"), LocalizedTextFactory(name="N/A")] ) ConceptFactory( version=HEAD, updated_by=user, parent=datatypes_source, concept_class="Datatype", names=[LocalizedTextFactory(name="Numeric")] ) ConceptFactory( version=HEAD, updated_by=user, parent=datatypes_source, concept_class="Datatype", names=[LocalizedTextFactory(name="Coded")] ) ConceptFactory( version=HEAD, updated_by=user, parent=datatypes_source, concept_class="Datatype", names=[LocalizedTextFactory(name="Text")] ) ConceptFactory( version=HEAD, updated_by=user, parent=nametypes_source, concept_class="NameType", names=[LocalizedTextFactory(name="FULLY_SPECIFIED"), LocalizedTextFactory(name="Fully Specified")] ) ConceptFactory( version=HEAD, updated_by=user, parent=nametypes_source, concept_class="NameType", names=[LocalizedTextFactory(name="Short"), LocalizedTextFactory(name="SHORT")] ) ConceptFactory( version=HEAD, updated_by=user, parent=nametypes_source, concept_class="NameType", names=[LocalizedTextFactory(name="INDEX_TERM"), LocalizedTextFactory(name="Index Term")] ) ConceptFactory( version=HEAD, updated_by=user, parent=nametypes_source, concept_class="NameType", names=[LocalizedTextFactory(name="None")] ) ConceptFactory( version=HEAD, updated_by=user, parent=descriptiontypes_source, concept_class="DescriptionType", names=[LocalizedTextFactory(name="None")] ) ConceptFactory( version=HEAD, updated_by=user, parent=descriptiontypes_source, concept_class="DescriptionType", names=[LocalizedTextFactory(name="FULLY_SPECIFIED")] ) ConceptFactory( version=HEAD, updated_by=user, parent=descriptiontypes_source, concept_class="DescriptionType", names=[LocalizedTextFactory(name="Definition")] ) ConceptFactory( version=HEAD, updated_by=user, parent=maptypes_source, concept_class="MapType", names=[LocalizedTextFactory(name="SAME-AS"), LocalizedTextFactory(name="Same As")] ) ConceptFactory( version=HEAD, updated_by=user, parent=maptypes_source, concept_class="MapType", names=[LocalizedTextFactory(name="Is Subset of")] ) ConceptFactory( version=HEAD, updated_by=user, parent=maptypes_source, concept_class="MapType", names=[LocalizedTextFactory(name="Different")] ) ConceptFactory( version=HEAD, updated_by=user, parent=maptypes_source, concept_class="MapType", names=[ LocalizedTextFactory(name="BROADER-THAN"), LocalizedTextFactory(name="Broader Than"), LocalizedTextFactory(name="BROADER_THAN") ] ) ConceptFactory( version=HEAD, updated_by=user, parent=maptypes_source, concept_class="MapType", names=[ LocalizedTextFactory(name="NARROWER-THAN"), LocalizedTextFactory(name="Narrower Than"), LocalizedTextFactory(name="NARROWER_THAN") ] ) ConceptFactory( version=HEAD, updated_by=user, parent=maptypes_source, concept_class="MapType", names=[LocalizedTextFactory(name="Q-AND-A")] ) ConceptFactory( version=HEAD, updated_by=user, parent=maptypes_source, concept_class="MapType", names=[LocalizedTextFactory(name="More specific than")] ) ConceptFactory( version=HEAD, updated_by=user, parent=maptypes_source, concept_class="MapType", names=[LocalizedTextFactory(name="Less specific than")] ) ConceptFactory( version=HEAD, updated_by=user, parent=maptypes_source, concept_class="MapType", names=[LocalizedTextFactory(name="Something Else")] ) ConceptFactory( version=HEAD, updated_by=user, parent=locales_source, concept_class="Locale", names=[LocalizedTextFactory(name="en")] ) ConceptFactory( version=HEAD, updated_by=user, parent=locales_source, concept_class="Locale", names=[LocalizedTextFactory(name="es")] ) ConceptFactory( version=HEAD, updated_by=user, parent=locales_source, concept_class="Locale", names=[LocalizedTextFactory(name="fr")] ) ConceptFactory( version=HEAD, updated_by=user, parent=locales_source, concept_class="Locale", names=[LocalizedTextFactory(name="tr")] ) ConceptFactory( version=HEAD, updated_by=user, parent=locales_source, concept_class="Locale", names=[LocalizedTextFactory(name="Abkhazian")] ) ConceptFactory( version=HEAD, updated_by=user, parent=locales_source, concept_class="Locale", names=[LocalizedTextFactory(name="English")] )