def test_insert_second_codebook_same_system_same_version(self): code_book_1 = CodeBook(name="pmi", version="v1", system="a") self.code_book_dao.insert(code_book_1) code_book_2 = CodeBook(name="pmi", version="v1", system="a") with self.assertRaises(BadRequest): self.code_book_dao.insert(code_book_2)
def test_insert_second_codebook_different_system(self): code_book_1 = CodeBook(name="pmi", version="v1", system="a") with FakeClock(TIME): self.code_book_dao.insert(code_book_1) code_book_2 = CodeBook(name="pmi", version="v2", system="b") with FakeClock(TIME_2): self.code_book_dao.insert(code_book_2) expected_code_book = CodeBook(codeBookId=1, latest=True, created=TIME, name="pmi", version="v1", system="a") self.assertEquals(expected_code_book.asdict(), self.code_book_dao.get(1).asdict()) expected_code_book_2 = CodeBook(codeBookId=2, latest=True, created=TIME_2, name="pmi", version="v2", system="b") self.assertEquals(expected_code_book_2.asdict(), self.code_book_dao.get(2).asdict())
def import_codebook(self, codebook_json): """Imports a codebook and all codes inside it. Returns (new_codebook, imported_code_count).""" version = codebook_json['version'] num_concepts = len(codebook_json['concept']) logging.info('Importing %d concepts into new CodeBook version %r...', num_concepts, version) system = codebook_json['url'] codebook = CodeBook(name=codebook_json['name'], version=version, system=system) code_count = 0 with self.session() as session: # Pre-fetch all Codes. This avoids any potential race conditions, and keeps a persistent # cache even though updates below invalidate the cache repeatedly. # Fetch within the session so later merges are faster. existing_codes = { (code.system, code.value): code for code in session.query(self.code_dao.model_type).all() } self.insert_with_session(session, codebook) session.flush() for i, concept in enumerate(codebook_json['concept'], start=1): logging.info('Importing root concept %d of %d (%s).', i, num_concepts, concept.get('display')) code_count += self._import_concept(session, existing_codes, concept, system, codebook.codeBookId, None) logging.info('Finished, %d codes imported.', code_count) return codebook, code_count
def test_update_codes_no_codebook_id(self): code_book_1 = CodeBook(name="pmi", version="v1", system="c") with FakeClock(TIME): self.code_book_dao.insert(code_book_1) code_1 = Code(codeBookId=1, system="a", value="b", display=u"c", topic=u"d", codeType=CodeType.MODULE, mapped=True) with FakeClock(TIME_2): self.code_dao.insert(code_1) new_code_1 = Code(codeId=1, system="x", value="b", display=u"c", topic=u"d", codeType=CodeType.MODULE, mapped=True) with self.assertRaises(BadRequest): self.code_dao.update(new_code_1)
def test_schema(self): session = self.database.make_session() hpo = HPO(hpoId=1, name='UNSET', displayName='No organization set', organizationType=OrganizationType.UNSET) code_book = CodeBook(codeBookId=1, created=datetime.datetime.now(), latest=True, name="pmi", system="http://foo/bar", version="v0.1.1") session.add(hpo) session.add(code_book) session.commit() organization = Organization(organizationId=1, externalId='org', displayName='Organization', hpoId=1) session.add(organization) session.commit() site = Site(siteId=1, siteName='site', googleGroup='*****@*****.**', mayolinkClientNumber=12345, organizationId=1) code1 = Code(codeId=1, codeBookId=1, system="a", value="b", shortValue="q", display=u"c", topic=u"d", codeType=CodeType.MODULE, mapped=True, created=datetime.datetime.now()) codeHistory1 = CodeHistory(codeId=1, codeBookId=1, system="a", value="b", shortValue="q", display=u"c", topic=u"d", codeType=CodeType.MODULE, mapped=True, created=datetime.datetime.now()) session.add(site) session.add(code1) session.add(codeHistory1) session.commit() code2 = Code(codeId=2, codeBookId=1, parentId=1, system="a", value="c", display=u"X", topic=u"d", codeType=CodeType.QUESTION, mapped=True, created=datetime.datetime.now()) codeHistory2 = CodeHistory(codeId=2, codeBookId=1, parentId=1, system="a", value="c", display=u"X", topic=u"d", codeType=CodeType.QUESTION, mapped=True, created=datetime.datetime.now()) session.add(code2) session.add(codeHistory2) session.commit() code3 = Code(codeId=3, codeBookId=1, parentId=2, system="a", value="d", display=u"Y", topic=u"d", codeType=CodeType.ANSWER, mapped=False, created=datetime.datetime.now()) codeHistory3 = CodeHistory(codeId=3, codeBookId=1, parentId=2, system="a", value="d", display=u"Y", topic=u"d", codeType=CodeType.ANSWER, mapped=False, created=datetime.datetime.now()) session.add(code3) session.add(codeHistory3) session.commit() session.commit() p = self._participant_with_defaults( participantId=1, version=1, biobankId=2, clientId='*****@*****.**', hpoId=hpo.hpoId, signUpTime=datetime.datetime.now(), lastModified=datetime.datetime.now()) ps = self._participant_summary_with_defaults( participantId=1, biobankId=2, lastModified=datetime.datetime.now(), hpoId=hpo.hpoId, firstName=self.fake.first_name(), middleName=self.fake.first_name(), lastName=self.fake.last_name(), email=self.fake.email(), zipCode='78751', dateOfBirth=datetime.date.today(), genderIdentityId=1, consentForStudyEnrollment=QuestionnaireStatus.SUBMITTED, consentForStudyEnrollmentTime=datetime.datetime.now(), numBaselineSamplesArrived=2) p.participantSummary = ps session.add(p) ph = self._participant_history_with_defaults( participantId=1, biobankId=2, clientId='*****@*****.**', hpoId=hpo.hpoId, signUpTime=datetime.datetime.now(), lastModified=datetime.datetime.now()) session.add(ph) session.commit() session.add( BiobankStoredSample(biobankStoredSampleId='WEB1234542', biobankId=p.biobankId, biobankOrderIdentifier='KIT', test='1UR10', confirmed=datetime.datetime.utcnow())) session.add( BiobankStoredSample( biobankStoredSampleId='WEB99999', # Sample ID must be unique. biobankId=p. biobankId, # Participant ID and test may be duplicated. biobankOrderIdentifier='KIT', test='1UR10', confirmed=datetime.datetime.utcnow())) pm = PhysicalMeasurements(physicalMeasurementsId=1, participantId=1, created=datetime.datetime.now(), resource='blah', final=False, logPosition=LogPosition()) pm2 = PhysicalMeasurements(physicalMeasurementsId=2, participantId=1, created=datetime.datetime.now(), resource='blah', final=True, amendedMeasurementsId=1, logPosition=LogPosition()) session.add(pm) session.add(pm2) session.commit() q1 = Measurement(measurementId=3, physicalMeasurementsId=pm.physicalMeasurementsId, codeSystem='codeSystem', codeValue='codeValue', measurementTime=datetime.datetime.now(), valueCodeSystem='valueCodeSystem', valueCodeValue='value3') session.add(q1) session.commit() m1 = Measurement(measurementId=1, physicalMeasurementsId=pm.physicalMeasurementsId, codeSystem='codeSystem', codeValue='codeValue', measurementTime=datetime.datetime.now(), bodySiteCodeSystem='bodySiteCodeSystem', bodySiteCodeValue='bodySiteCodeValue', valueString='a', valueDecimal=1.2, valueUnit='cm', valueCodeSystem='valueCodeSystem', valueCodeValue='value', valueDateTime=datetime.datetime.now(), qualifierId=q1.measurementId) session.add(m1) session.commit() m2 = Measurement(measurementId=2, physicalMeasurementsId=pm.physicalMeasurementsId, codeSystem='codeSystem', codeValue='codeValue', measurementTime=datetime.datetime.now(), valueCodeSystem='valueCodeSystem', valueCodeValue='value2', parentId=m1.measurementId, qualifierId=q1.measurementId) session.add(m2) session.commit() q = Questionnaire(questionnaireId=1, version=1, created=datetime.datetime.now(), lastModified=datetime.datetime.now(), resource='what?') qh = QuestionnaireHistory(questionnaireId=1, version=1, created=datetime.datetime.now(), lastModified=datetime.datetime.now(), resource='what?') qh.questions.append( QuestionnaireQuestion(questionnaireQuestionId=1, questionnaireId=1, questionnaireVersion=1, linkId="1.2.3", codeId=2, repeats=True)) qh.concepts.append( QuestionnaireConcept(questionnaireConceptId=1, questionnaireId=1, questionnaireVersion=1, codeId=1)) session.add(q) session.add(qh) session.commit() qr = QuestionnaireResponse(questionnaireResponseId=1, questionnaireId=1, questionnaireVersion=1, participantId=1, created=datetime.datetime.now(), resource='blah') qr.answers.append( QuestionnaireResponseAnswer(questionnaireResponseAnswerId=1, questionnaireResponseId=1, questionId=1, endTime=datetime.datetime.now(), valueSystem='a', valueCodeId=3, valueDecimal=123, valueString=self.fake.first_name(), valueDate=datetime.date.today())) session.add(qr) session.commit() mv = MetricsVersion(metricsVersionId=1, inProgress=False, complete=True, date=datetime.datetime.utcnow(), dataVersion=1) session.add(mv) session.commit() mb = MetricsBucket(metricsVersionId=1, date=datetime.date.today(), hpoId='PITT', metrics='blah') session.add(mb) session.commit()
def test_insert_with_codebook_and_parent(self): code_book_1 = CodeBook(name="pmi", version="v1", system="a") with FakeClock(TIME): self.code_book_dao.insert(code_book_1) expected_code_book = CodeBook(codeBookId=1, latest=True, created=TIME, name="pmi", version="v1", system="a") self.assertEquals(expected_code_book.asdict(), self.code_book_dao.get(1).asdict()) code_1 = Code(codeBookId=1, system="a", value="b", display=u"c", topic=u"d", codeType=CodeType.MODULE, mapped=True) with FakeClock(TIME_2): self.code_dao.insert(code_1) expected_code = Code(codeBookId=1, codeId=1, system="a", value="b", display=u"c", topic=u"d", codeType=CodeType.MODULE, mapped=True, created=TIME_2) self.assertEquals(expected_code.asdict(), self.code_dao.get(1).asdict()) expected_code_history = CodeHistory(codeBookId=1, codeHistoryId=1, codeId=1, system="a", value=u"b", display=u"c", topic=u"d", codeType=CodeType.MODULE, mapped=True, created=TIME_2) self.assertEquals(expected_code_history.asdict(), self.code_history_dao.get(1).asdict()) code_2 = Code(codeBookId=1, system="x", value="y", display=u"z", topic=u"q", codeType=CodeType.QUESTION, mapped=False, parentId=1) with FakeClock(TIME_3): self.code_dao.insert(code_2) expected_code_2 = Code(codeBookId=1, codeId=2, system="x", value="y", display=u"z", topic=u"q", codeType=CodeType.QUESTION, mapped=False, created=TIME_3, parentId=1) self.assertEquals(expected_code_2.asdict(), self.code_dao.get(2).asdict())
def test_import_codebook(self): answer_1 = _make_concept(u"t1", "Answer", "c1", u"d1") answer_2 = _make_concept(u"t2", "Answer", "c2", u"d2") answer_3 = _make_concept(u"t2", "Answer", "c3", u"d3") question_1 = _make_concept(u"t1", "Question", "q1", u"d4", [answer_1]) question_2 = _make_concept(u"t2", "Question", "q2", u"d5", [answer_2, answer_3]) topic_1 = _make_concept(u"t1", "Topic", "t1", u"d6", [question_1]) module_1 = _make_concept(u"mt1", "Module Name", "m1", u"d7", [topic_1]) module_2 = _make_concept(u"mt2", "Module Name", "m2", u"d8", [question_2]) system = 'http://blah/foo' codebook = { 'name': 'pmi', 'version': 'v1', 'url': system, 'concept': [module_1, module_2] } with FakeClock(TIME): self.code_book_dao.import_codebook(codebook) expectedCodeBook = CodeBook(codeBookId=1, latest=True, created=TIME, name="pmi", version="v1", system=system) self.assertEquals(expectedCodeBook.asdict(), self.code_book_dao.get(1).asdict()) expectedModule1 = Code(codeBookId=1, codeId=1, system=system, value="m1", shortValue="m1", display=u"d7", topic=u"mt1", codeType=CodeType.MODULE, mapped=True, created=TIME) self.assertEquals(expectedModule1.asdict(), self.code_dao.get(1).asdict()) expectedModuleHistory1 = CodeHistory(codeHistoryId=1, codeBookId=1, codeId=1, system=system, value="m1", shortValue="m1", display=u"d7", topic=u"mt1", codeType=CodeType.MODULE, mapped=True, created=TIME) self.assertEquals(expectedModuleHistory1.asdict(), self.code_history_dao.get(1).asdict()) expectedTopic1 = Code(codeBookId=1, codeId=2, system=system, value="t1", shortValue="t1", display=u"d6", topic=u"t1", codeType=CodeType.TOPIC, mapped=True, created=TIME, parentId=1) self.assertEquals(expectedTopic1.asdict(), self.code_dao.get(2).asdict()) expectedQuestion1 = Code(codeBookId=1, codeId=3, system=system, value="q1", shortValue="q1", display=u"d4", topic=u"t1", codeType=CodeType.QUESTION, mapped=True, created=TIME, parentId=2) self.assertEquals(expectedQuestion1.asdict(), self.code_dao.get(3).asdict()) expectedAnswer1 = Code(codeBookId=1, codeId=4, system=system, value="c1", shortValue="c1", display=u"d1", topic=u"t1", codeType=CodeType.ANSWER, mapped=True, created=TIME, parentId=3) self.assertEquals(expectedAnswer1.asdict(), self.code_dao.get(4).asdict())
def test_update_codes_new_codebook_id(self): code_book_1 = CodeBook(name="pmi", version="v1", system="a") with FakeClock(TIME): self.code_book_dao.insert(code_book_1) code_1 = Code(codeBookId=1, system="a", value="b", display=u"c", topic=u"d", codeType=CodeType.MODULE, mapped=True) with FakeClock(TIME_2): self.code_dao.insert(code_1) code_book_2 = CodeBook(name="pmi", version="v2", system="a") with FakeClock(TIME_3): self.code_book_dao.insert(code_book_2) new_code_1 = Code(codeBookId=2, codeId=1, system="x", value="b", display=u"c", topic=u"d", codeType=CodeType.MODULE, mapped=True) with FakeClock(TIME_4): self.code_dao.update(new_code_1) expected_code = Code(codeBookId=2, codeId=1, system="x", value="b", display=u"c", topic=u"d", codeType=CodeType.MODULE, mapped=True, created=TIME_2) self.assertEquals(expected_code.asdict(), self.code_dao.get(1).asdict()) expected_code_history = CodeHistory(codeBookId=1, codeHistoryId=1, codeId=1, system="a", value="b", display=u"c", topic=u"d", codeType=CodeType.MODULE, mapped=True, created=TIME_2) self.assertEquals(expected_code_history.asdict(), self.code_history_dao.get(1).asdict()) expected_code_history_2 = CodeHistory(codeHistoryId=2, codeBookId=2, codeId=1, system="x", value="b", display=u"c", topic=u"d", codeType=CodeType.MODULE, mapped=True, created=TIME_2) self.assertEquals(expected_code_history_2.asdict(), self.code_history_dao.get(2).asdict())