예제 #1
0
 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)'])
     )
예제 #2
0
    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)
예제 #3
0
    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])
        )
예제 #4
0
    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])
        )
예제 #5
0
    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])
        )
예제 #6
0
    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)'])
        )
예제 #7
0
    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)
예제 #8
0
    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)
예제 #9
0
    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.'],
        })
예제 #10
0
    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)'])
        )
예제 #11
0
    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
            )
        )
예제 #12
0
    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
            )
        )
예제 #13
0
    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)'])
        )
예제 #14
0
    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)
예제 #15
0
    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
예제 #16
0
    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'])
        )
예제 #17
0
    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)
예제 #18
0
    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)
예제 #19
0
    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)']}
        )
예제 #20
0
    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")]
        )