def test_extras_get_200(self):
        names = [LocalizedTextFactory()]
        concept = ConceptFactory(parent=self.source,
                                 names=names,
                                 extras=dict(foo='bar'))
        extras_url = "/orgs/{}/sources/{}/concepts/{}/extras/".format(
            self.organization.mnemonic, self.source.mnemonic, concept.mnemonic)

        response = self.client.get(extras_url,
                                   HTTP_AUTHORIZATION='Token ' + self.token,
                                   format='json')

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data, dict(foo='bar'))
    def test_delete_400(self):
        names = [LocalizedTextFactory()]
        concept = ConceptFactory(parent=self.source, names=names, retired=True)
        concepts_url = "/orgs/{}/sources/{}/concepts/{}/".format(
            self.organization.mnemonic, self.source.mnemonic, concept.mnemonic)

        response = self.client.delete(concepts_url + '?includeRetired=true',
                                      {'update_comment': 'Deleting it'},
                                      HTTP_AUTHORIZATION='Token ' + self.token,
                                      format='json')

        self.assertEqual(response.status_code, 400)
        self.assertEqual(response.data,
                         {'__all__': 'Concept is already retired'})
示例#3
0
    def test_post_without_to_and_from_concept_url_201(self):
        source = UserSourceFactory(user=self.user, mnemonic='source')
        response = self.client.post(
            source.mappings_url,
            {
                "map_type": "Same As",
                "from_source_url": source.uri,
                "from_source_version": "2.46",
                "from_concept_code": "32700-7",
                "from_concept_name": "Microscopic observation [Identifier] in Blood by Malaria smear",
                "to_source_url": "/orgs/WHO/sources/ICPC-2/",
                "to_source_version": "v11",
                "to_concept_code": "A73",
                "to_concept_name": "Malaria"
            },
            HTTP_AUTHORIZATION='Token ' + self.token,
        )
        self.assertEqual(response.status_code, 201)
        self.assertEqual(response.data['from_source_url'], source.uri)
        self.assertEqual(response.data['from_source_version'], '2.46')
        self.assertEqual(response.data['from_concept_code'], '32700-7')
        self.assertEqual(
            response.data['from_concept_name'], 'Microscopic observation [Identifier] in Blood by Malaria smear'
        )
        self.assertEqual(response.data['to_source_url'], "/orgs/WHO/sources/ICPC-2/")
        self.assertEqual(response.data['to_source_version'], 'v11')
        self.assertEqual(response.data['to_concept_code'], 'A73')
        self.assertEqual(response.data['to_concept_name'], 'Malaria')
        mapping = source.mappings.first()
        self.assertIsNone(mapping.from_concept_id)
        self.assertIsNone(mapping.to_concept_id)
        self.assertIsNone(mapping.to_source_id)

        org = OrganizationFactory(mnemonic='WHO')
        source = OrganizationSourceFactory(organization=org, mnemonic='ICPC-2')
        source.update_mappings()

        mapping.refresh_from_db()
        self.assertEqual(mapping.to_source_url, source.uri)
        self.assertEqual(mapping.to_source, source)
        self.assertIsNone(mapping.to_concept)

        concept = ConceptFactory(parent=source, mnemonic='A73', names=[LocalizedTextFactory(name='Malaria Updated')])
        concept.update_mappings()
        mapping.refresh_from_db()
        self.assertEqual(mapping.to_concept_code, 'A73')
        self.assertEqual(mapping.to_concept_name, 'Malaria')
        self.assertEqual(mapping.to_source, source)
        self.assertEqual(mapping.to_source, concept.parent)
        self.assertEqual(mapping.to_concept, concept)
示例#4
0
    def test_concept_class_is_valid_attribute_negative(self):
        source = OrganizationSourceFactory(custom_validation_schema=CUSTOM_VALIDATION_SCHEMA_OPENMRS)
        concept = Concept.persist_new(
            dict(
                mnemonic='concept1', version=HEAD, name='concept1', parent=source,
                concept_class='XYZQWERT', datatype='None',
                names=[LocalizedTextFactory.build(name='Grip', locale='es', locale_preferred=True)]
            )
        )

        self.assertEqual(
            concept.errors,
            dict(concept_class=[OPENMRS_CONCEPT_CLASS])
        )
示例#5
0
    def test_validate_openmrs_schema_duplicate_locale_type(self):
        ch_locale = LocalizedTextFactory(locale_preferred=True, locale='ch')
        en_locale = LocalizedTextFactory(locale_preferred=True, locale='en')
        concept1 = ConceptFactory(names=[ch_locale, en_locale])
        collection = OrganizationCollectionFactory(
            custom_validation_schema=CUSTOM_VALIDATION_SCHEMA_OPENMRS)
        collection.concepts.add(concept1)
        concept1_reference = CollectionReference(expression=concept1.uri)
        concept1_reference.save()
        collection.references.add(concept1_reference)

        concept2 = ConceptFactory(names=[ch_locale, en_locale])
        concept2_reference = CollectionReference(expression=concept2.uri)

        with self.assertRaises(ValidationError) as ex:
            collection.validate(concept2_reference)

        self.assertEqual(
            ex.exception.message_dict, {
                'names': [
                    'Concept fully specified name must be unique for same collection and locale.'
                ]
            })
示例#6
0
    def test_invalid_map_type(self):
        source = OrganizationSourceFactory(
            version=HEAD,
            custom_validation_schema=CUSTOM_VALIDATION_SCHEMA_OPENMRS)
        concept1 = ConceptFactory(parent=source,
                                  names=[LocalizedTextFactory()])
        concept2 = ConceptFactory(parent=source,
                                  names=[LocalizedTextFactory()])

        mapping = MappingFactory.build(parent=source,
                                       to_concept=concept1,
                                       from_concept=concept2,
                                       map_type='Foo bar')

        with self.assertRaises(ValidationError) as ex:
            mapping.clean()
        self.assertEqual(ex.exception.messages, ['Invalid mapping type'])

        # 'Q-AND-A' is present in OpenMRS lookup values
        mapping = MappingFactory.build(parent=source,
                                       to_concept=concept1,
                                       from_concept=concept2,
                                       map_type='Q-AND-A')
        mapping.clean()
示例#7
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)']}
        )
示例#8
0
    def test_get_to_concept_name(self):
        mapping = Mapping()

        self.assertIsNone(mapping.get_to_concept_name())

        mapping = Mapping(to_concept_name='to-concept-name')

        self.assertEqual(mapping.get_to_concept_name(), 'to-concept-name')

        concept = ConceptFactory(names=[LocalizedTextFactory()])
        self.assertIsNotNone(concept.display_name)

        mapping = Mapping(to_concept=concept)

        self.assertEqual(mapping.get_to_concept_name(), concept.display_name)
示例#9
0
    def test_names_post_400(self):
        name = LocalizedTextFactory()
        concept = ConceptFactory(parent=self.source, names=[name])

        response = self.client.post(
            "/orgs/{}/sources/{}/concepts/{}/names/".format(
                self.organization.mnemonic, self.source.mnemonic,
                concept.mnemonic), {
                    "type": 'ConceptName',
                    "name": name.name,
                    "name_type": "Fully Specified"
                },
            HTTP_AUTHORIZATION='Token ' + self.token,
            format='json')
        self.assertEqual(response.status_code, 400)
        self.assertEqual(list(response.data.keys()), ['locale'])
示例#10
0
    def test_extra_delete_404(self):
        names = [LocalizedTextFactory()]
        concept = ConceptFactory(parent=self.source,
                                 names=names,
                                 extras=dict(foo='bar', tao='ching'))

        def extra_url(extra):
            return "/orgs/{}/sources/{}/concepts/{}/extras/{}/".format(
                self.organization.mnemonic, self.source.mnemonic,
                concept.mnemonic, extra)

        response = self.client.delete(extra_url('bar'),
                                      HTTP_AUTHORIZATION='Token ' + self.token,
                                      format='json')

        self.assertEqual(response.status_code, 404)
示例#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_extra_put_400(self):
        names = [LocalizedTextFactory()]
        concept = ConceptFactory(parent=self.source,
                                 names=names,
                                 extras=dict(foo='bar', tao='ching'))

        def extra_url(extra):
            return "/orgs/{}/sources/{}/concepts/{}/extras/{}/".format(
                self.organization.mnemonic, self.source.mnemonic,
                concept.mnemonic, extra)

        response = self.client.put(extra_url('tao'),
                                   dict(tao=None),
                                   HTTP_AUTHORIZATION='Token ' + self.token,
                                   format='json')

        self.assertEqual(response.status_code, 400)
        self.assertEqual(response.data, ['Must specify tao param in body.'])
        concept.refresh_from_db()
        self.assertEqual(concept.extras, dict(foo='bar', tao='ching'))
示例#13
0
    def test_delete_204(self):
        names = [LocalizedTextFactory()]
        concept = ConceptFactory(parent=self.source, names=names)
        concepts_url = "/orgs/{}/sources/{}/concepts/{}/".format(
            self.organization.mnemonic, self.source.mnemonic, concept.mnemonic)

        response = self.client.delete(concepts_url,
                                      {'update_comment': 'Deleting it'},
                                      HTTP_AUTHORIZATION='Token ' + self.token,
                                      format='json')

        self.assertEqual(response.status_code, 204)

        concept.refresh_from_db()

        self.assertEqual(concept.versions.count(), 2)
        latest_version = concept.versions.order_by('-created_at').first()
        self.assertTrue(latest_version.retired)
        self.assertTrue(concept.retired)
        self.assertTrue(latest_version.comment, 'Deleting it')
示例#14
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)'])
        )
示例#15
0
文件: tests.py 项目: ibacher/oclapi2
    def test_unretire(self):
        source = OrganizationSourceFactory(version=HEAD)
        concept = Concept.persist_new({
            **factory.build(dict, FACTORY_CLASS=ConceptFactory), 'mnemonic':
            'c1',
            'parent':
            source,
            'retired':
            True,
            'names': [
                LocalizedTextFactory.build(locale='en',
                                           name='English',
                                           locale_preferred=True)
            ]
        })
        Concept.persist_clone(concept.clone(), concept.created_by)
        concept_v1 = Concept.objects.order_by('-created_at').first()
        concept.refresh_from_db()

        self.assertEqual(concept.versions.count(), 2)
        self.assertTrue(concept.retired)
        self.assertFalse(concept.is_latest_version)
        self.assertTrue(concept.is_versioned_object)
        self.assertTrue(concept_v1.is_latest_version)

        concept_v1.unretire(
            concept.created_by,
            'World needs you!')  # concept will become old/prev version
        concept.refresh_from_db()
        concept_v1.refresh_from_db()

        self.assertFalse(concept_v1.is_latest_version)
        self.assertEqual(concept.versions.count(), 3)
        self.assertFalse(concept.retired)
        latest_version = concept.get_latest_version()
        self.assertFalse(latest_version.retired)
        self.assertEqual(latest_version.comment, 'World needs you!')

        self.assertEqual(concept.unretire(concept.created_by),
                         {'__all__': CONCEPT_IS_ALREADY_NOT_RETIRED})
示例#16
0
    def test_names_get_200(self):
        name = LocalizedTextFactory()
        concept = ConceptFactory(parent=self.source, names=[name])

        response = self.client.get(
            "/orgs/{}/sources/{}/concepts/{}/names/".format(
                self.organization.mnemonic, self.source.mnemonic,
                concept.mnemonic),
            HTTP_AUTHORIZATION='Token ' + self.token,
            format='json')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 1)
        self.assertEqual(
            dict(response.data[0]), {
                "uuid": str(name.id),
                "external_id": None,
                "type": 'ConceptName',
                "locale": name.locale,
                "locale_preferred": False,
                "name": name.name,
                "name_type": "FULLY_SPECIFIED"
            })
示例#17
0
    def test_post_using_canonical_url_201(self):  # pylint: disable=too-many-statements
        source = UserSourceFactory(user=self.user, mnemonic='source')
        response = self.client.post(
            source.mappings_url,
            {
                "map_type": "Same As",
                "from_source_url": "http://loinc.org",
                "from_source_version": "2.46",
                "from_concept_code": "32700-7",
                "from_concept_name": "Microscopic observation [Identifier] in Blood by Malaria smear",
                "to_source_url": "http://who.int/ICPC-2",
                "to_source_version": "v11",
                "to_concept_code": "A73",
                "to_concept_name": "Malaria"
            },
            HTTP_AUTHORIZATION='Token ' + self.token,
        )
        self.assertEqual(response.status_code, 201)
        self.assertEqual(response.data['from_source_url'], 'http://loinc.org')
        self.assertEqual(response.data['from_source_version'], '2.46')
        self.assertEqual(response.data['from_concept_code'], '32700-7')
        self.assertEqual(
            response.data['from_concept_name'], 'Microscopic observation [Identifier] in Blood by Malaria smear'
        )
        self.assertEqual(response.data['to_source_url'], "http://who.int/ICPC-2")
        self.assertEqual(response.data['to_source_version'], 'v11')
        self.assertEqual(response.data['to_concept_code'], 'A73')
        self.assertEqual(response.data['to_concept_name'], 'Malaria')
        mapping = source.mappings.first()
        self.assertIsNone(mapping.from_concept_id)
        self.assertIsNone(mapping.to_concept_id)
        self.assertIsNone(mapping.to_source_id)

        to_source = OrganizationSourceFactory(canonical_url="http://who.int/ICPC-2")
        to_source.update_mappings()
        mapping.refresh_from_db()

        self.assertEqual(mapping.to_source_url, to_source.canonical_url)
        self.assertEqual(mapping.to_source, to_source)
        self.assertEqual(mapping.to_source_version, 'v11')

        concept = ConceptFactory(parent=to_source, mnemonic='A73', names=[LocalizedTextFactory(name='foobar')])
        concept.update_mappings()

        mapping.refresh_from_db()
        self.assertEqual(mapping.to_concept, concept)
        self.assertTrue(mapping.to_concept_code == concept.mnemonic == 'A73')
        self.assertEqual(mapping.to_concept_name, 'Malaria')
        self.assertNotEqual(concept.display_name, 'Malaria')
        self.assertEqual(mapping.from_concept, None)
        self.assertEqual(mapping.from_source, None)

        from_source = OrganizationSourceFactory(canonical_url="http://loinc.org")
        from_source.update_mappings()
        mapping.refresh_from_db()

        self.assertTrue(mapping.from_source_url == from_source.canonical_url == "http://loinc.org")
        self.assertEqual(mapping.from_source_version, "2.46")
        self.assertEqual(mapping.from_source, from_source)

        concept = ConceptFactory(parent=from_source, mnemonic='32700-7', names=[LocalizedTextFactory(name='foobar')])
        concept.update_mappings()

        mapping.refresh_from_db()
        self.assertEqual(mapping.from_concept, concept)
        self.assertTrue(mapping.from_concept_code == concept.mnemonic == '32700-7')
        self.assertEqual(mapping.from_concept_name, 'Microscopic observation [Identifier] in Blood by Malaria smear')
        self.assertNotEqual(concept.display_name, 'Microscopic observation [Identifier] in Blood by Malaria smear')

        # retrievals with lookups
        response = self.client.get(
            mapping.uri,
            HTTP_AUTHORIZATION='Token ' + self.token,
        )

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data['url'], mapping.uri)
        self.assertTrue('from_concept' not in response.data)
        self.assertTrue('to_concept' not in response.data)
        self.assertTrue('from_source' not in response.data)
        self.assertTrue('to_source' not in response.data)

        response = self.client.get(
            mapping.uri + '?lookupConcepts=false',
            HTTP_AUTHORIZATION='Token ' + self.token,
        )

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data['url'], mapping.uri)
        self.assertTrue('from_concept' not in response.data)
        self.assertTrue('to_concept' not in response.data)
        self.assertTrue('from_source' not in response.data)
        self.assertTrue('to_source' not in response.data)

        response = self.client.get(
            mapping.uri + '?lookupConcepts=true',
            HTTP_AUTHORIZATION='Token ' + self.token,
        )

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data['url'], mapping.uri)
        self.assertIsNotNone(response.data['from_concept'])
        self.assertIsNotNone(response.data['to_concept'])
        self.assertTrue('from_source' not in response.data)
        self.assertTrue('to_source' not in response.data)

        response = self.client.get(
            mapping.uri + '?lookupFromConcept=true',
            HTTP_AUTHORIZATION='Token ' + self.token,
        )

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data['url'], mapping.uri)
        self.assertIsNotNone(response.data['from_concept'])
        self.assertTrue('to_concept' not in response.data)
        self.assertTrue('from_source' not in response.data)
        self.assertTrue('to_source' not in response.data)

        response = self.client.get(
            mapping.uri + '?lookupToConcept=true',
            HTTP_AUTHORIZATION='Token ' + self.token,
        )

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data['url'], mapping.uri)
        self.assertIsNotNone(response.data['to_concept'])
        self.assertTrue('from_concept' not in response.data)
        self.assertTrue('from_source' not in response.data)
        self.assertTrue('to_source' not in response.data)

        response = self.client.get(
            mapping.uri + '?lookupSources=true',
            HTTP_AUTHORIZATION='Token ' + self.token,
        )

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data['url'], mapping.uri)
        self.assertTrue('from_concept' not in response.data)
        self.assertTrue('to_concept' not in response.data)
        self.assertIsNotNone(response.data['from_source'])
        self.assertIsNotNone(response.data['to_source'])

        response = self.client.get(
            mapping.uri + '?lookupFromSource=true',
            HTTP_AUTHORIZATION='Token ' + self.token,
        )

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data['url'], mapping.uri)
        self.assertTrue('from_concept' not in response.data)
        self.assertTrue('to_concept' not in response.data)
        self.assertIsNotNone(response.data['from_source'])
        self.assertTrue('to_source' not in response.data)

        response = self.client.get(
            mapping.uri + '?lookupToSource=true',
            HTTP_AUTHORIZATION='Token ' + self.token,
        )

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data['url'], mapping.uri)
        self.assertTrue('from_concept' not in response.data)
        self.assertTrue('to_concept' not in response.data)
        self.assertIsNotNone(response.data['to_source'])
        self.assertTrue('from_source' not in response.data)

        response = self.client.get(
            mapping.uri + '?lookupFromSource=true&lookupToSource=true',
            HTTP_AUTHORIZATION='Token ' + self.token,
        )

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data['url'], mapping.uri)
        self.assertTrue('from_concept' not in response.data)
        self.assertTrue('to_concept' not in response.data)
        self.assertIsNotNone(response.data['from_source'])
        self.assertIsNotNone(response.data['to_source'])
示例#18
0
文件: tests.py 项目: ibacher/oclapi2
    def test_display_locale(self):
        preferred_locale = LocalizedTextFactory(locale_preferred=True)
        concept = ConceptFactory(names=(preferred_locale, ))

        self.assertEqual(concept.display_locale, preferred_locale.locale)
示例#19
0
    def test_hierarchy(self):  # pylint: disable=too-many-statements
        # Av1
        parent_concept = ConceptFactory(
            names=[LocalizedTextFactory(locale='en', name='English', locale_preferred=True)])
        self.assertEqual(parent_concept.versions.count(), 1)
        source = parent_concept.parent

        # Av1 -> None and Av2 -> Bv1
        child_concept = Concept.persist_new({
            **factory.build(dict, FACTORY_CLASS=ConceptFactory), 'mnemonic': 'c1', 'parent': source,
            'names': [LocalizedTextFactory.build(locale='en', name='English', locale_preferred=True)],
            'parent_concept_urls': [parent_concept.uri]
        })

        parent_concept_latest_version = parent_concept.get_latest_version()
        self.assertEqual(child_concept.errors, {})
        self.assertIsNotNone(child_concept.id)
        self.assertEqual(parent_concept.versions.count(), 2)
        self.assertEqual(child_concept.versions.count(), 1)
        self.assertEqual(list(child_concept.parent_concept_urls), [parent_concept.uri])
        self.assertEqual(list(child_concept.child_concept_urls), [])
        self.assertEqual(list(parent_concept.child_concept_urls), [child_concept.uri])
        self.assertEqual(list(parent_concept_latest_version.child_concept_urls), [child_concept.uri])
        self.assertEqual(list(parent_concept_latest_version.prev_version.child_concept_urls), [])

        # Av1 -> None and Av2 -> Bv1, Bv2 and Bv2 -> Cv1
        child_child_concept = Concept.persist_new({
            **factory.build(dict, FACTORY_CLASS=ConceptFactory), 'mnemonic': 'c2', 'parent': source,
            'names': [LocalizedTextFactory.build(locale='en', name='English', locale_preferred=True)],
            'parent_concept_urls': [child_concept.uri]
        })

        self.assertEqual(child_child_concept.errors, {})
        self.assertIsNotNone(child_child_concept.id)
        self.assertEqual(parent_concept.versions.count(), 2)
        self.assertEqual(child_concept.versions.count(), 2)
        self.assertEqual(child_child_concept.versions.count(), 1)
        self.assertEqual(list(child_child_concept.parent_concept_urls), [child_concept.uri])
        self.assertEqual(list(child_child_concept.get_latest_version().parent_concept_urls), [child_concept.uri])
        self.assertEqual(list(child_child_concept.child_concept_urls), [])
        self.assertEqual(list(child_concept.child_concept_urls), [child_child_concept.uri])
        self.assertEqual(list(child_concept.parent_concept_urls), [parent_concept.uri])
        self.assertEqual(list(child_concept.get_latest_version().child_concept_urls), [child_child_concept.uri])
        self.assertEqual(list(child_concept.get_latest_version().parent_concept_urls), [parent_concept.uri])
        self.assertEqual(list(parent_concept.child_concept_urls), [child_concept.uri])
        # Av1 -> None and Av2 -> Bv1,Bv2 -> Cv1 and Av3 -> Bv3,Cv2
        Concept.create_new_version_for(
            instance=child_child_concept.clone(),
            data=dict(
                parent_concept_urls=[parent_concept.uri],
                names=[dict(locale='en', name='English', locale_preferred=True)]
            ),
            user=child_child_concept.created_by
        )

        self.assertEqual(parent_concept.versions.count(), 3)
        self.assertEqual(child_concept.versions.count(), 3)
        self.assertEqual(child_child_concept.versions.count(), 2)

        child_child_latest_version = child_child_concept.get_latest_version()
        self.assertEqual(list(child_child_concept.parent_concept_urls), [parent_concept.uri])
        self.assertEqual(list(child_child_latest_version.parent_concept_urls), [parent_concept.uri])
        self.assertEqual(list(child_child_latest_version.prev_version.parent_concept_urls), [child_concept.url])

        parent_concept_latest_version = parent_concept.get_latest_version()
        self.assertListEqual(
            sorted(list(parent_concept.child_concept_urls)),
            sorted([child_concept.uri, child_child_concept.uri])
        )
        self.assertEqual(
            sorted(list(parent_concept_latest_version.child_concept_urls)),
            sorted([child_concept.uri, child_child_concept.uri])
        )
        self.assertEqual(list(parent_concept_latest_version.prev_version.child_concept_urls), [child_concept.url])

        child_latest_version = child_concept.get_latest_version()

        self.assertEqual(list(child_concept.child_concept_urls), [])
        self.assertEqual(list(child_latest_version.child_concept_urls), [])

        self.assertEqual(list(child_latest_version.prev_version.child_concept_urls), [child_child_concept.uri])

        # Av1 -> None and Av2 -> Bv1,Bv2 -> Cv1 and Av3 -> Bv3,Cv2 and Av4 -> Bv4 -> Cv3
        Concept.create_new_version_for(
            instance=child_child_concept.clone(),
            data=dict(
                parent_concept_urls=[child_concept.uri],
                names=[dict(locale='en', name='English', locale_preferred=True)]
            ),
            user=child_child_concept.created_by
        )

        self.assertEqual(parent_concept.versions.count(), 4)
        self.assertEqual(child_concept.versions.count(), 4)
        self.assertEqual(child_child_concept.versions.count(), 3)

        child_child_latest_version = child_child_concept.get_latest_version()
        self.assertEqual(
            list(child_child_concept.parent_concept_urls), [child_concept.uri])
        self.assertEqual(
            list(child_child_latest_version.parent_concept_urls), [child_concept.uri])
        self.assertEqual(
            list(child_child_latest_version.prev_version.parent_concept_urls), [parent_concept.url])
        self.assertEqual(
            list(child_child_latest_version.prev_version.prev_version.parent_concept_urls), [child_concept.url])

        child_latest_version = child_concept.get_latest_version()
        self.assertEqual(list(child_concept.child_concept_urls), [child_child_concept.uri])
        self.assertEqual(list(child_latest_version.child_concept_urls), [child_child_concept.uri])
        self.assertEqual(
            list(child_latest_version.prev_version.child_concept_urls), []
        )
        self.assertEqual(
            list(child_latest_version.prev_version.prev_version.child_concept_urls),
            [child_child_concept.uri]
        )
        self.assertEqual(
            list(child_latest_version.prev_version.prev_version.prev_version.child_concept_urls),
            []
        )

        parent_concept_latest_version = parent_concept.get_latest_version()
        self.assertListEqual(
            sorted(list(parent_concept.child_concept_urls)),
            sorted([child_concept.uri])
        )
        self.assertEqual(
            sorted(list(parent_concept_latest_version.child_concept_urls)),
            sorted([child_concept.uri])
        )
        self.assertEqual(
            sorted(list(parent_concept_latest_version.prev_version.child_concept_urls)),
            sorted([child_concept.uri, child_child_concept.uri])
        )
        self.assertEqual(
            list(parent_concept_latest_version.prev_version.prev_version.child_concept_urls),
            [child_concept.uri]
        )
        self.assertEqual(
            list(parent_concept_latest_version.prev_version.prev_version.prev_version.child_concept_urls),
            []
        )

        # Av1 -> None and Av2 -> Bv1,Bv2 -> Cv1 and Av3 -> Bv3,Cv2 and Av4 -> Bv4 -> Cv3 and Av4 -> Bv5 -> None and Cv4
        Concept.create_new_version_for(
            instance=child_child_concept.clone(),
            data=dict(
                parent_concept_urls=[],
                names=[dict(locale='en', name='English', locale_preferred=True)]
            ),
            user=child_child_concept.created_by
        )

        self.assertEqual(parent_concept.versions.count(), 4)
        self.assertEqual(child_concept.versions.count(), 5)
        self.assertEqual(child_child_concept.versions.count(), 4)

        child_child_latest_version = child_child_concept.get_latest_version()
        self.assertEqual(
            list(child_child_concept.parent_concept_urls), [])
        self.assertEqual(
            list(child_child_latest_version.parent_concept_urls), [])
        self.assertEqual(
            list(child_child_latest_version.prev_version.parent_concept_urls), [child_concept.uri])
        self.assertEqual(
            list(child_child_latest_version.prev_version.prev_version.parent_concept_urls), [parent_concept.url])
        self.assertEqual(
            list(child_child_latest_version.prev_version.prev_version.prev_version.parent_concept_urls),
            [child_concept.url]
        )

        child_latest_version = child_concept.get_latest_version()
        self.assertEqual(list(child_concept.child_concept_urls), [])
        self.assertEqual(list(child_latest_version.child_concept_urls), [])
        self.assertEqual(list(child_latest_version.prev_version.child_concept_urls), [child_child_concept.uri])
        self.assertEqual(
            list(child_latest_version.prev_version.prev_version.child_concept_urls), []
        )
        self.assertEqual(
            list(child_latest_version.prev_version.prev_version.prev_version.child_concept_urls),
            [child_child_concept.uri]
        )
        self.assertEqual(
            list(child_latest_version.prev_version.prev_version.prev_version.prev_version.child_concept_urls),
            []
        )

        parent_concept_latest_version = parent_concept.get_latest_version()
        self.assertListEqual(
            sorted(list(parent_concept.child_concept_urls)),
            sorted([child_concept.uri])
        )
        self.assertEqual(
            sorted(list(parent_concept_latest_version.child_concept_urls)),
            sorted([child_concept.uri])
        )
        self.assertEqual(
            sorted(list(parent_concept_latest_version.prev_version.child_concept_urls)),
            sorted([child_concept.uri, child_child_concept.uri])
        )
        self.assertEqual(
            list(parent_concept_latest_version.prev_version.prev_version.child_concept_urls),
            [child_concept.uri]
        )
        self.assertEqual(
            list(parent_concept_latest_version.prev_version.prev_version.prev_version.child_concept_urls),
            []
        )
示例#20
0
 def setUp(self):
     super().setUp()
     self.extras = dict(foo='bar', tao='ching')
     self.concept = ConceptFactory(extras=self.extras, names=[LocalizedTextFactory()])
     self.user = UserProfileFactory(organizations=[self.concept.parent.organization])
     self.token = self.user.get_token()
示例#21
0
 def setUp(self):
     super().setUp()
     self.concept = ConceptFactory(names=[LocalizedTextFactory()])
     self.user = UserProfileFactory(
         organizations=[self.concept.parent.organization])
     self.token = self.user.get_token()
示例#22
0
 def setUp(self):
     super().setUp()
     self.concept = ConceptFactory(names=[LocalizedTextFactory()])
示例#23
0
    def create_lookup_concept_classes(user=None, org=None):
        from core.sources.tests.factories import OrganizationSourceFactory
        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 = OrganizationSourceFactory(updated_by=user,
                                                   organization=org,
                                                   mnemonic="Classes",
                                                   version=HEAD)
        datatypes_source = OrganizationSourceFactory(updated_by=user,
                                                     organization=org,
                                                     mnemonic="Datatypes",
                                                     version=HEAD)
        nametypes_source = OrganizationSourceFactory(updated_by=user,
                                                     organization=org,
                                                     mnemonic="NameTypes",
                                                     version=HEAD)
        descriptiontypes_source = OrganizationSourceFactory(
            updated_by=user,
            organization=org,
            mnemonic="DescriptionTypes",
            version=HEAD)
        maptypes_source = OrganizationSourceFactory(updated_by=user,
                                                    organization=org,
                                                    mnemonic="MapTypes",
                                                    version=HEAD)
        locales_source = OrganizationSourceFactory(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")])
示例#24
0
文件: tests.py 项目: ibacher/oclapi2
    def test_names_for_default_locale(self):
        es_locale = LocalizedTextFactory(locale='es', name='Not English')
        en_locale = LocalizedTextFactory(locale='en', name='English')
        concept = ConceptFactory(names=(es_locale, en_locale))

        self.assertEqual(concept.names_for_default_locale, [en_locale.name])
示例#25
0
    def test_put_200_openmrs_schema(self):  # pylint: disable=too-many-statements
        self.create_lookup_concept_classes()
        source = OrganizationSourceFactory(
            custom_validation_schema=CUSTOM_VALIDATION_SCHEMA_OPENMRS)
        name = LocalizedTextFactory(locale='fr')
        concept = ConceptFactory(parent=source, names=[name])
        self.assertEqual(concept.versions.count(), 1)
        response = self.client.put(concept.uri, {
            **self.concept_payload, 'datatype': 'None',
            'update_comment': 'Updated datatype'
        },
                                   HTTP_AUTHORIZATION='Token ' + self.token,
                                   format='json')

        self.assertEqual(response.status_code, 200)
        self.assertListEqual(list(response.data.keys()), [
            'uuid', 'id', 'external_id', 'concept_class', 'datatype', 'url',
            'retired', 'source', 'owner', 'owner_type', 'owner_url',
            'display_name', 'display_locale', 'names', 'descriptions',
            'created_on', 'updated_on', 'versions_url', 'version', 'extras',
            'name', 'type', 'update_comment', 'version_url', 'mappings',
            'updated_by', 'created_by', 'internal_reference_id',
            'parent_concept_urls', 'child_concept_urls'
        ])

        names = response.data['names']

        version = Concept.objects.last()
        concept.refresh_from_db()

        self.assertFalse(version.is_versioned_object)
        self.assertTrue(version.is_latest_version)
        self.assertEqual(version.versions.count(), 2)
        self.assertEqual(response.data['uuid'], str(version.id))
        self.assertEqual(response.data['datatype'], 'None')
        self.assertEqual(response.data['update_comment'], 'Updated datatype')
        self.assertEqual(response.data['concept_class'], 'Procedure')
        self.assertEqual(response.data['url'], concept.uri)
        self.assertEqual(response.data['url'], version.versioned_object.uri)
        self.assertEqual(response.data['version_url'], version.uri)
        self.assertFalse(response.data['retired'])
        self.assertEqual(response.data['source'], source.mnemonic)
        self.assertEqual(response.data['owner'], source.organization.mnemonic)
        self.assertEqual(response.data['owner_type'], "Organization")
        self.assertEqual(response.data['owner_url'], source.organization.uri)
        self.assertEqual(response.data['display_name'], 'c1 name')
        self.assertEqual(response.data['display_locale'], 'en')
        self.assertEqual(response.data['versions_url'],
                         concept.uri + 'versions/')
        self.assertEqual(response.data['version'], str(version.id))
        self.assertEqual(response.data['extras'], dict(foo='bar'))
        self.assertEqual(response.data['type'], 'Concept')
        self.assertEqual(response.data['version_url'], version.uri)
        self.assertEqual(response.data['mappings'], [])
        self.assertTrue(concept.is_versioned_object)
        self.assertEqual(concept.datatype, "None")

        # same names in update
        names[0]['uuid'] = str(name.id)
        [name.pop('type', None) for name in names]  # pylint: disable=expression-not-assigned
        response = self.client.put(concept.uri, {
            **self.concept_payload, 'names': names,
            'datatype': 'Numeric',
            'update_comment': 'Updated datatype'
        },
                                   HTTP_AUTHORIZATION='Token ' + self.token,
                                   format='json')

        self.assertEqual(response.status_code, 200)

        concept.refresh_from_db()
        self.assertEqual(concept.datatype, "Numeric")
        self.assertEqual(concept.names.count(), 1)

        latest_version = concept.get_latest_version()
        prev_version = latest_version.prev_version
        self.assertEqual(latest_version.names.count(), 1)
        self.assertEqual(prev_version.names.count(), 1)
        self.assertEqual(prev_version.names.first().name,
                         latest_version.names.first().name)
        self.assertEqual(prev_version.names.first().locale,
                         latest_version.names.first().locale)
示例#26
0
文件: tests.py 项目: ibacher/oclapi2
    def test_display_name(self):
        source = OrganizationSourceFactory(default_locale='fr',
                                           supported_locales=['fr', 'ti'])
        ch_locale = LocalizedTextFactory(locale_preferred=True, locale='ch')
        en_locale = LocalizedTextFactory(locale_preferred=True, locale='en')
        concept = ConceptFactory(names=[ch_locale, en_locale], parent=source)

        self.assertEqual(
            concept.display_name,
            en_locale.name)  # locale preferred order by created at desc

        source.supported_locales = ['fr', 'ti', 'ch']
        source.save()
        self.assertEqual(
            concept.display_name,
            ch_locale.name)  # locale preferred parent's supported locale

        # taking scenarios for ciel 1366 concept
        concept = ConceptFactory(
            parent=source,
            names=[
                LocalizedTextFactory(locale_preferred=True,
                                     locale='en',
                                     name='MALARIA SMEAR, QUALITATIVE'),
                LocalizedTextFactory(type='SHORT',
                                     locale_preferred=False,
                                     locale='en',
                                     name='malaria sm, qual'),
                LocalizedTextFactory(locale_preferred=False,
                                     locale='en',
                                     name='Jungle fever smear'),
                LocalizedTextFactory(locale_preferred=True,
                                     locale='fr',
                                     name='FROTTIS POUR DÉTECTER PALUDISME'),
                LocalizedTextFactory(locale_preferred=False,
                                     locale='ht',
                                     name='tès MALARYA , kalitatif'),
                LocalizedTextFactory(locale_preferred=False,
                                     locale='es',
                                     name='frotis de malaria (cualitativo)'),
                LocalizedTextFactory(locale_preferred=False,
                                     locale='es',
                                     name='Frotis de paludismo'),
            ])

        source.default_locale = 'en'
        source.supported_locales = ['en']
        source.save()
        self.assertEqual(concept.display_name, 'MALARIA SMEAR, QUALITATIVE')

        source.default_locale = 'fr'
        source.supported_locales = ['fr', 'en']
        source.save()
        self.assertEqual(concept.display_name,
                         'FROTTIS POUR DÉTECTER PALUDISME')

        source.default_locale = 'es'
        source.supported_locales = ['es']
        source.save()
        self.assertEqual(concept.display_name, 'Frotis de paludismo')

        source.default_locale = 'ht'
        source.supported_locales = ['ht', 'en']
        source.save()
        self.assertEqual(concept.display_name, 'tès MALARYA , kalitatif')

        source.default_locale = 'ti'
        source.supported_locales = ['ti']
        source.save()
        self.assertEqual(
            concept.display_name,
            'MALARIA SMEAR, QUALITATIVE')  # system default locale = en

        source.default_locale = 'ti'
        source.supported_locales = ['ti', 'en']
        source.save()
        self.assertEqual(concept.display_name, 'MALARIA SMEAR, QUALITATIVE')
示例#27
0
    def test_post_with_source_versions_without_to_concept_exists_201(self):
        source = UserSourceFactory(user=self.user, mnemonic='source')
        source_v1 = UserSourceFactory(
            user=source.parent, mnemonic=source.mnemonic, version='v1.1'
        )
        concept = ConceptFactory(parent=source, sources=[source_v1])

        response = self.client.post(
            source.mappings_url,
            {
                "map_type": "Same As",
                "from_concept_url": concept.get_latest_version().uri,
                "from_source_version": "v1.1",
                "to_source_url": "/orgs/WHO/sources/ICPC-2/",
                "to_source_version": "v11",
                "to_concept_code": "A73",
            },
            HTTP_AUTHORIZATION='Token ' + self.token,
        )
        self.assertEqual(response.status_code, 201)
        self.assertEqual(response.data['from_source_url'], source.uri)
        self.assertEqual(response.data['from_source_version'], 'v1.1')
        self.assertEqual(response.data['from_concept_code'], concept.mnemonic)
        self.assertEqual(response.data['from_concept_name'], None)
        self.assertEqual(response.data['to_source_url'], "/orgs/WHO/sources/ICPC-2/")
        self.assertEqual(response.data['to_source_version'], 'v11')
        self.assertEqual(response.data['to_concept_code'], 'A73')
        self.assertEqual(response.data['to_concept_name'], None)
        mapping = source.mappings.first()
        self.assertEqual(mapping.from_concept, concept.get_latest_version())
        self.assertIsNone(mapping.to_concept_id)
        self.assertIsNone(mapping.to_source_id)

        concept2 = ConceptFactory(parent=source, sources=[source_v1], names=[LocalizedTextFactory()])
        self.assertIsNotNone(concept2.display_name)

        response = self.client.post(
            source.mappings_url,
            {
                "map_type": "Same As",
                "from_concept_url": concept2.get_latest_version().uri,
                "from_source_version": "v1.1",
                "to_source_url": "/orgs/WHO/sources/ICPC-2/v11/",
                "to_concept_code": "A73",
            },
            HTTP_AUTHORIZATION='Token ' + self.token,
        )
        self.assertEqual(response.status_code, 201)
        self.assertEqual(response.data['from_source_url'], source.uri)
        self.assertEqual(response.data['from_source_version'], 'v1.1')
        self.assertEqual(response.data['from_concept_code'], concept2.mnemonic)
        self.assertEqual(response.data['from_concept_name'], None)
        self.assertEqual(response.data['to_source_url'], "/orgs/WHO/sources/ICPC-2/")
        self.assertEqual(response.data['to_source_version'], 'v11')
        self.assertEqual(response.data['to_concept_code'], 'A73')
        self.assertEqual(response.data['to_concept_name'], None)
        mapping = source.mappings.last()
        self.assertEqual(mapping.from_concept, concept2.get_latest_version())
        self.assertIsNone(mapping.to_concept_id)
        self.assertIsNone(mapping.to_source_id)

        response = self.client.post(
            source.mappings_url,
            {
                "map_type": "Same As",
                "from_concept_url": concept2.get_latest_version().uri,
                "from_source_version": "v1.1",
                "to_source_url": "/orgs/WHO/sources/ICPC-2/v11/",
                "to_concept_code": "A73",
            },
            HTTP_AUTHORIZATION='Token ' + self.token,
        )
        self.assertEqual(response.status_code, 400)
        self.assertEqual(
            response.data, {'__all__': ['Parent, map_type, from_concept, to_source, to_concept_code must be unique.']}
        )