def test_all_elements_are_required(self): """All the sub-elements are required""" all = dict( user_ref=UserRef(oid="AUser"), location_ref=LocationRef(oid="ALocation"), signature_ref=SignatureRef(oid="ASignature"), date_time_stamp=DateTimeStamp( date_time=datetime( year=2016, month=12, day=25, hour=12, minute=0, second=0 ) ), ) t0 = Signature() with self.assertRaises(ValueError) as exc: doc = obj_to_doc(t0) self.assertEqual("User Reference not set.", str(exc.exception)) t1 = Signature(user_ref=all.get("user_ref")) with self.assertRaises(ValueError) as exc: doc = obj_to_doc(t1) self.assertEqual("Location Reference not set.", str(exc.exception)) t2 = Signature( user_ref=all.get("user_ref"), location_ref=all.get("location_ref") ) with self.assertRaises(ValueError) as exc: doc = obj_to_doc(t2) self.assertEqual("Signature Reference not set.", str(exc.exception)) t3 = Signature( user_ref=all.get("user_ref"), location_ref=all.get("location_ref"), signature_ref=all.get("signature_ref"), ) with self.assertRaises(ValueError) as exc: doc = obj_to_doc(t3) self.assertEqual("DateTime not set.", str(exc.exception))
def test_all_elements_are_required(self): """All the sub-elements are required""" all = dict( user_ref=UserRef(oid="AUser"), location_ref=LocationRef(oid="ALocation"), signature_ref=SignatureRef(oid="ASignature"), date_time_stamp=DateTimeStamp(date_time=datetime( year=2016, month=12, day=25, hour=12, minute=0, second=0)), ) t0 = Signature() with self.assertRaises(ValueError) as exc: doc = obj_to_doc(t0) self.assertEqual("User Reference not set.", str(exc.exception)) t1 = Signature(user_ref=all.get("user_ref")) with self.assertRaises(ValueError) as exc: doc = obj_to_doc(t1) self.assertEqual("Location Reference not set.", str(exc.exception)) t2 = Signature(user_ref=all.get("user_ref"), location_ref=all.get("location_ref")) with self.assertRaises(ValueError) as exc: doc = obj_to_doc(t2) self.assertEqual("Signature Reference not set.", str(exc.exception)) t3 = Signature( user_ref=all.get("user_ref"), location_ref=all.get("location_ref"), signature_ref=all.get("signature_ref"), ) with self.assertRaises(ValueError) as exc: doc = obj_to_doc(t3) self.assertEqual("DateTime not set.", str(exc.exception))
def test_whole_item_group(self): """mdsol:Submission should be wholeitemgroup or SpecifiedItemsOnly""" doc = obj_to_doc(self.tested, "TESTFORM") self.assertEqual(doc.attrib["mdsol:Submission"], "SpecifiedItemsOnly") self.tested.whole_item_group = True doc = obj_to_doc(self.tested, "TESTFORM") self.assertEqual(doc.attrib["mdsol:Submission"], "WholeItemGroup")
def test_creation_datetime(self): """Create multiple ODM and get different datetimes""" obj_1 = ODM("Test User", fileoid="1234", source_system="Battlestar", source_system_version="1.04") tested_1 = obj_to_doc(obj=obj_1) with patch('rwslib.builders.common.datetime') as mock_dt: # offset the time to ensure we don't overlap mock_dt.utcnow.return_value = datetime.datetime.utcnow() + datetime.timedelta(seconds=61) obj_2 = ODM("Test User", fileoid="1235", source_system="Battlestar", source_system_version="1.04") tested_2 = obj_to_doc(obj=obj_2) self.assertEqual(tested_1.get('Originator'), tested_2.get('Originator')) self.assertEqual(tested_1.get('SourceSystem'), tested_2.get('SourceSystem')) self.assertNotEqual(tested_1.get('FileOID'), tested_2.get('FileOID')) self.assertNotEqual(tested_1.get('CreationDateTime'), tested_2.get('CreationDateTime'))
def test_create_location_of_type(self): """Create a Location with typ""" obj = Location("Site1", "Site One", location_type=LocationType.Site) tested = obj_to_doc(obj) self.assertEqual("Location", tested.tag) # this is an enum self.assertEqual("Site", tested.get('LocationType'))
def test_create_location(self): """Create a Location""" obj = Location("Site1", "Site One") tested = obj_to_doc(obj) self.assertEqual("Location", tested.tag) self.assertEqual("Site1", tested.get('OID')) self.assertEqual("Site One", tested.get('Name'))
def test_create_user(self): """Create a User""" obj = User("user1", user_type=UserType.Investigator) tested = obj_to_doc(obj) self.assertEqual("User", tested.tag) self.assertEqual("user1", tested.get('OID')) self.assertEqual("Investigator", tested.get('UserType'))
def test_builder_with_datetime(self): dt = datetime(2015, 9, 11, 10, 15, 22, 80) tested = DateTimeStamp(dt) doc = obj_to_doc(tested) self.assertEqual(dt_to_iso8601(dt), doc.text) self.assertEqual(doc.tag, "DateTimeStamp")
def test_builder(self): """Test building XML""" tested = ReasonForChange("Testing 1..2..3") doc = obj_to_doc(tested) self.assertEqual("Testing 1..2..3", doc.text) self.assertEqual(doc.tag, "ReasonForChange")
def test_builder_int_oid(self): """Test building XML""" tested = LocationRef(12) doc = obj_to_doc(tested) self.assertEqual(doc.attrib["LocationOID"], "12") self.assertEqual(doc.tag, "LocationRef")
def test_builder(self): """Test building XML""" tested = LocationRef("Gainesville") doc = obj_to_doc(tested) self.assertEqual(doc.attrib["LocationOID"], "Gainesville") self.assertEqual(doc.tag, "LocationRef")
def test_builder(self): """Test building XML""" tested = UserRef("Fred") doc = obj_to_doc(tested) self.assertEqual(doc.attrib["UserOID"], "Fred") self.assertEqual(doc.tag, "UserRef")
def test_builder(self): """Test building XML""" tested = ItemData("FIELDA", "TEST", lock=True, verify=True, freeze=False) tested << AuditRecord( edit_point=AuditRecord.EDIT_DATA_MANAGEMENT, used_imputation_method=False, identifier="x2011", include_file_oid=False, )( UserRef("Fred"), LocationRef("Site102"), ReasonForChange("Data Entry Error"), DateTimeStamp(datetime(2015, 9, 11, 10, 15, 22, 80)), ) tested << MdsolQuery() tested << MeasurementUnitRef("Celsius") doc = obj_to_doc(tested) self.assertEqual(doc.attrib["ItemOID"], "FIELDA") self.assertEqual(doc.attrib["Value"], "TEST") self.assertEqual(doc.attrib["mdsol:Verify"], "Yes") self.assertEqual(doc.attrib["mdsol:Lock"], "Yes") self.assertEqual(doc.attrib["mdsol:Freeze"], "No") self.assertEqual(doc.tag, "ItemData") self.assertEqual("AuditRecord", list(doc)[0].tag) self.assertEqual("MeasurementUnitRef", list(doc)[1].tag) self.assertEqual("mdsol:Query", list(doc)[2].tag)
def test_add_milestone(self): """We add a Milestone""" obj = SubjectData("Subject 1", "Site 1") obj.add_milestone("Randomised") tested = obj_to_doc(obj) self.assertEqual('Annotation', list(tested)[1].tag) self.assertEqual('Randomised', list(list(list(tested)[1])[0])[0].text)
def test_no_value(self): """No FlagValue is an exception""" tested = Flag() tested << FlagType("Some type", codelist_oid="ANOTHEROID") with self.assertRaises(ValueError) as exc: t = obj_to_doc(tested) self.assertEqual("FlagValue is not set.", str(exc.exception))
def test_create_a_version_ref_and_attach_to_location(self): """We create a MetaDataVersionRef""" this = MetaDataVersionRef( "Mediflex(Prod)", "1024", datetime.datetime.utcnow() - datetime.timedelta(days=7)) that = MetaDataVersionRef("Mediflex(Prod)", "1025", datetime.datetime.utcnow()) obj = Location('Site01', 'Site 1') obj << this obj << that tested = obj_to_doc(obj) self.assertEqual("Location", tested.tag) self.assertTrue(len(list(tested)) == 2) _this = list(tested)[0] self.assertEqual("Mediflex(Prod)", _this.get('StudyOID')) self.assertEqual("1024", _this.get('MetaDataVersionOID')) self.assertTrue( _this.get('EffectiveDate').startswith( (datetime.date.today() - datetime.timedelta(days=7)).isoformat())) _that = list(tested)[1] self.assertEqual("Mediflex(Prod)", _that.get('StudyOID')) self.assertEqual("1025", _that.get('MetaDataVersionOID')) self.assertTrue( _that.get('EffectiveDate').startswith( datetime.date.today().isoformat()))
def test_last_update_time_set(self): """We don't see a LastUpdateTime for naiive elements""" obj = ItemData(itemoid="BRTHDAT", value="12 DEC 1975") obj.set_update_time() tested = obj_to_doc(obj) self.assertEqual("ItemData", tested.tag) self.assertIsNotNone(tested.get('mdsol:LastUpdateTime'))
def test_modm_attributes(self): """Each modm attribute is settable""" for attribute in [ "ExternalStudyID", "StudyUUID", "AuditSubCategoryName", "StudyName", "ClientDivisionUUID", "ClientDivisionSchemeUUID", "SDRCompleteDate", "SDVCompleteDate", "LockCompleteDate", "IsSDVRequired", "IsSDVComplete" ]: data = ClinicalData("Mediflex", "Prod", metadata_version_oid="1012") if "UUID" in attribute: data.add_attribute(attribute, uuid.uuid4()) elif "Date" in attribute: data.add_attribute( attribute, fake.date_time_this_year(before_now=True, after_now=False, tzinfo=None)) elif attribute.startswith('Is'): data.add_attribute(attribute, random.choice(YesNoRave)) else: data.add_attribute(attribute, "Blargle") tested = obj_to_doc(data) self.assertIsNotNone(tested.get("mdsol:{}".format(attribute)))
def test_add_last_update_time(self): """We add a LastUpdateTime""" obj = SubjectData("Subject 1", "Site 1") now = datetime.datetime.utcnow() obj.last_update_time = now tested = obj_to_doc(obj) self.assertEqual(now.isoformat(), tested.get('mdsol:LastUpdateTime'))
def test_add_last_update_time(self): """We add a LastUpdateTime""" clindata = ClinicalData("Mediflex", "Prod", metadata_version_oid="1012") now = datetime.datetime.utcnow() clindata.last_update_time = now tested = obj_to_doc(clindata) self.assertEqual(now.isoformat(), tested.get('mdsol:LastUpdateTime'))
def test_last_update_time_naiive(self): """We don't see a LastUpdateTime for naive elements""" clindata = ClinicalData("Mediflex", "Prod", metadata_version_oid="1012") tested = obj_to_doc(clindata) self.assertIsNone(tested.get('mdsol:LastUpdateTime'))
def test_form_repeat_key(self): """Test transaction type inserted if set""" tested = FormData("TESTFORM_A", form_repeat_key=9)( ItemGroupData()(ItemData("Field1", "ValueA"), ItemData("Field2", "ValueB")) ) doc = obj_to_doc(tested) self.assertEqual(doc.attrib["FormRepeatKey"], "9")
def test_multiple_subject_data(self): """We can add multiple SubjectData to the Clinical Data""" cd = ClinicalData("Mediflex", "Prod") cd << SubjectData("Site1", "Subject1") cd << SubjectData("Site1", "Subject2") doc = obj_to_doc(cd) self.assertEqual(2, len(doc))
def test_modm_attributes(self): """Each modm attribute is settable""" for attribute in [ "StartWindowDate", "EndWindowDate", "StudyEventUUID", "InstanceName", "VisitTargetDate", "InstanceId", "InstanceOverDue", "InstanceStartWindow", "InstanceEndWindow", "InstanceClose", "InstanceAccess", "StudyEventDate", "SDRCompleteDate", "SDVCompleteDate", "LockCompleteDate", "VisitFirstDataEntryDate", "IsSDVComplete", "IsSDVRequired" ]: data = StudyEventData("VISIT1") if "UUID" in attribute: data.add_attribute(attribute, uuid.uuid4()) elif "Date" in attribute: data.add_attribute( attribute, fake.date_time_this_year(before_now=True, after_now=False, tzinfo=None)) elif attribute.startswith('Is'): data.add_attribute(attribute, random.choice(YesNoRave)) else: data.add_attribute(attribute, "Blargle") tested = obj_to_doc(data) self.assertIsNotNone(tested.get("mdsol:{}".format(attribute)))
def test_metadata_version_oid(self): """ Test we can handle a MDV as a String """ self.tested.metadata_version_oid = "2" doc = obj_to_doc(self.tested) self.assertEqual(doc.attrib["MetaDataVersionOID"], self.tested.metadata_version_oid)
def test_add_last_update_time(self): """We add a LastUpdateTime""" obj = ItemGroupData(itemgroupoid="DM") now = datetime.datetime.utcnow() obj.last_update_time = now tested = obj_to_doc(obj) self.assertEqual("ItemGroupData", tested.tag) self.assertEqual(now.isoformat(), tested.get('mdsol:LastUpdateTime'))
def test_add_milestone(self): """We add a single milestone""" obj = StudyEventData("VISIT1") obj.add_milestone("Informed Consent") tested = obj_to_doc(obj) self.assertEqual('Annotation', list(tested)[0].tag) annotation = list(tested)[0] self.assertEqual('Informed Consent', list(list(annotation)[0])[0].text)
def test_metadata_version_oid_as_int(self): """ Test that we can handle a MDV as an integer (which we are mandating in the IG) """ self.tested.metadata_version_oid = 56 doc = obj_to_doc(self.tested) self.assertEqual(doc.attrib["MetaDataVersionOID"], str(self.tested.metadata_version_oid))
def test_happy_path_no_commenter(self): """Creating a valid Comment without a commenter, no problems""" tested = Comment() tested.text = "Some comment" t = obj_to_doc(tested) self.assertEqual("Comment", t.tag) self.assertNotIn("SponsorOrSite", t.attrib) self.assertEqual("Some comment", t.text)
def test_add_last_update_time(self): """We add a LastUpdateTime""" obj = StudyEventData("VISIT1") now = datetime.datetime.utcnow() obj.last_update_time = now tested = obj_to_doc(obj) self.assertEqual("StudyEventData", tested.tag) self.assertEqual(now.isoformat(), tested.get('mdsol:LastUpdateTime'))
def test_add_milestone(self): """We add a single milestone""" obj = ItemData(itemoid="BRTHDAT", value="12 DEC 1975") obj.add_milestone("Informed Consent") tested = obj_to_doc(obj) self.assertEqual('Annotation', list(tested)[0].tag) annotation = list(tested)[0] self.assertEqual('Informed Consent', list(list(annotation)[0])[0].text)
def test_add_last_update_time(self): """We add a LastUpdateTime""" obj = ItemData(itemoid="BRTHDAT", value="12 DEC 1975") now = datetime.datetime.utcnow() obj.last_update_time = now tested = obj_to_doc(obj) self.assertEqual("ItemData", tested.tag) self.assertEqual(now.isoformat(), tested.get('mdsol:LastUpdateTime'))
def test_insert_pd_to_itemdata(self): """Create a simple protocol deviation with class and code and Transaction Type""" test = ItemData("FIXOID", "Fix me")(MdsolProtocolDeviation(value="Deviated from Protocol", status=ProtocolDeviationStatus.Open, repeat_key=1, code="E01", klass="Blargle", transaction_type="Insert")) tested = obj_to_doc(test) self.assertEqual(1, len(list(tested))) self.assertEqual('mdsol:ProtocolDeviation', list(tested)[0].tag) test << MdsolProtocolDeviation(value="Deviated from Protocol", status=ProtocolDeviationStatus.Open, repeat_key=2, code="E01", klass="Blargle", transaction_type="Insert") tested = obj_to_doc(test) self.assertEqual(2, len(list(tested))) self.assertEqual('mdsol:ProtocolDeviation', list(tested)[1].tag) self.assertEqual(2, list(tested)[1].get('ProtocolDeviationRepeatKey'))
def test_add_milestone(self): """We add a single milestone""" obj = ItemGroupData(itemgroupoid="DM") obj.add_milestone("Informed Consent") tested = obj_to_doc(obj) self.assertEqual('Annotation', list(tested)[0].tag) annotation = list(tested)[0] self.assertEqual('Informed Consent', list(list(annotation)[0])[0].text)
def test_happy_path(self): """Create a Flag object""" tested = Flag() tested << FlagValue("Some value", codelist_oid="ANOID") tested << FlagType("Some type", codelist_oid="ANOTHEROID") t = obj_to_doc(tested) self.assertEqual("Flag", t.tag) self.assertTrue(len(list(t)) == 2)
def test_modm_bool_attribute(self): """A boolean gets mapped to Yes or No""" data = ItemData(itemoid="BRTHDAT", value="12 DEC 1975") data.add_attribute("IsSDVRequired", True) data.add_attribute("IsSDVComplete", False) tested = obj_to_doc(data) self.assertEqual(tested.get("mdsol:IsSDVRequired"), "Yes") self.assertEqual(tested.get("mdsol:IsSDVComplete"), "No")
def test_add_to_odm(self): """We can add multiple ClinicalData to an ODM""" odm = ODM("Some test case") odm << ClinicalData("Study1", "Dev") odm << ClinicalData("Study1", "Dev") tested = obj_to_doc(odm) self.assertEqual("ODM", tested.tag) self.assertTrue(2, len(list(tested)))
def test_happy_path(self): """Create a FlagValue object""" tested = FlagValue("A Value") tested.codelist_oid = "ANOID" t = obj_to_doc(tested) self.assertEqual("FlagValue", t.tag) self.assertEqual("ANOID", t.attrib["CodeListOID"]) self.assertEqual("A Value", t.text)