def test_composite_key(self):
        known_coding = Coding(
            system=SNOMED, code='26294005',
            display='Radical prostatectomy (nerve-sparing)').add_if_not_found(
            True)

        mp = ModelPersistence(
            Coding, sequence_name='codings_id_seq',
            lookup_field=('system', 'code'))
        data = known_coding.as_fhir()

        # Modify only the `display` - composite keys should still match
        modified_data = data.copy()
        modified_data['display'] = 'Radical prostatectomy'
        modified = Coding.from_fhir(data)
        match, _ = mp.lookup_existing(
            new_obj=modified, new_data=modified_data)
        assert data == match.as_fhir()

        # Import and see the change
        updated = mp.update(modified_data)
        assert modified == updated

        # Export and verify
        serial = mp.serialize()
        assert modified_data in serial
    def test_identifier_lookup(self):
        # setup a minimal communication request
        from tests.test_communication import mock_communication_request
        from tests.test_assessment_status import mock_tnth_questionnairebanks
        from portal.system_uri import TRUENTH_CR_NAME
        from portal.models.identifier import Identifier
        mock_tnth_questionnairebanks()
        cr = mock_communication_request(
            'symptom_tracker_recurring', '{"days": 14}')
        cr.identifiers.append(
            Identifier(value='2 week ST', system=TRUENTH_CR_NAME))
        with SessionScope(db):
            db.session.add(cr)
            db.session.commit()
        cr = db.session.merge(cr)
        assert cr.identifiers.count() == 1

        data = cr.as_fhir()
        mp = ModelPersistence(
            CommunicationRequest,
            sequence_name='communication_requests_id_seq',
            lookup_field='identifier')
        new_obj = CommunicationRequest.from_fhir(data)
        match, field_description = mp.lookup_existing(
            new_obj=new_obj, new_data=data)
        assert match.name == cr.name