def test_bolus(self): self.assertEqual( NightscoutEntry.bolus( bolus=7.5, carbs=45, created_at="2021-03-16 00:25:21-04:00"), { "eventType": "Combo Bolus", "created_at": "2021-03-16 00:25:21-04:00", "carbs": 45, "insulin": 7.5, "notes": "", "enteredBy": "Pump (tconnectsync)" } ) self.assertEqual( NightscoutEntry.bolus( bolus=0.5, carbs=5, created_at="2021-03-16 12:25:21-04:00"), { "eventType": "Combo Bolus", "created_at": "2021-03-16 12:25:21-04:00", "carbs": 5, "insulin": 0.5, "notes": "", "enteredBy": "Pump (tconnectsync)" } )
def test_bolus_with_bg(self): self.assertEqual( NightscoutEntry.bolus(bolus=7.5, carbs=45, created_at="2021-03-16 00:25:21-04:00", bg="123", bg_type=NightscoutEntry.SENSOR), { "eventType": "Combo Bolus", "created_at": "2021-03-16 00:25:21-04:00", "carbs": 45, "insulin": 7.5, "notes": "", "enteredBy": "Pump (tconnectsync)", "glucose": "123", "glucoseType": "Sensor" }) self.assertEqual( NightscoutEntry.bolus(bolus=0.5, carbs=5, created_at="2021-03-16 12:25:21-04:00", bg="150", bg_type=NightscoutEntry.FINGER), { "eventType": "Combo Bolus", "created_at": "2021-03-16 12:25:21-04:00", "carbs": 5, "insulin": 0.5, "notes": "", "enteredBy": "Pump (tconnectsync)", "glucose": "150", "glucoseType": "Finger" })
def test_basal(self): self.assertEqual( NightscoutEntry.basal(value=1.05, duration_mins=30, created_at="2021-03-16 00:25:21-04:00"), { "eventType": "Temp Basal", "reason": "", "duration": 30, "absolute": 1.05, "rate": 1.05, "created_at": "2021-03-16 00:25:21-04:00", "carbs": None, "insulin": None, "enteredBy": "Pump (tconnectsync)" }) self.assertEqual( NightscoutEntry.basal(value=0.95, duration_mins=5, created_at="2021-03-16 12:25:21-04:00", reason="Correction"), { "eventType": "Temp Basal", "reason": "Correction", "duration": 5, "absolute": 0.95, "rate": 0.95, "created_at": "2021-03-16 12:25:21-04:00", "carbs": None, "insulin": None, "enteredBy": "Pump (tconnectsync)" })
def test_new_ciq_basal_data(self): tconnect = TConnectApi() # datetimes are unused by the API fake start = datetime.datetime(2021, 4, 20, 12, 0) end = datetime.datetime(2021, 4, 21, 12, 0) def fake_therapy_timeline(time_start, time_end): self.assertEqual(time_start, start) self.assertEqual(time_end, end) return TestBasalSync.get_example_ciq_basal_events() tconnect.controliq.therapy_timeline = fake_therapy_timeline tconnect.ws2.therapy_timeline_csv = self.stub_therapy_timeline_csv nightscout = NightscoutApi() nightscout.last_uploaded_entry = self.stub_last_uploaded_entry nightscout.last_uploaded_activity = self.stub_last_uploaded_activity process_time_range(tconnect, nightscout, start, end, pretend=False, features=[BOLUS, BASAL]) self.assertEqual(len(nightscout.uploaded_entries["treatments"]), 4) self.assertDictEqual(dict(nightscout.uploaded_entries), { "treatments": [ NightscoutEntry.basal(0.8, 20.35, "2021-03-16 00:00:00-04:00", reason="tempDelivery"), NightscoutEntry.basal(0.799, 5.0, "2021-03-16 00:20:21-04:00", reason="profileDelivery"), NightscoutEntry.basal(0.797, 5.0, "2021-03-16 00:25:21-04:00", reason="algorithmDelivery"), NightscoutEntry.basal(0, 2693/60, "2021-03-16 00:30:21-04:00", reason="algorithmDelivery (control-iq suspension)") ]}) self.assertDictEqual(nightscout.put_entries, {}) self.assertListEqual(nightscout.deleted_entries, [])
def test_with_updated_duration_ciq_basal_data(self): tconnect = TConnectApi() start = datetime.datetime(2021, 4, 20, 12, 0) end = datetime.datetime(2021, 4, 21, 12, 0) def fake_therapy_timeline(time_start, time_end): self.assertEqual(time_start, start) self.assertEqual(time_end, end) return TestBasalSync.get_example_ciq_basal_events() tconnect.controliq.therapy_timeline = fake_therapy_timeline tconnect.ws2.therapy_timeline_csv = self.stub_therapy_timeline_csv nightscout = NightscoutApi() def fake_last_uploaded_entry(event_type): if event_type == "Temp Basal": return { "created_at": "2021-03-16 00:20:21-04:00", "duration": 3, "_id": "nightscout_id" } nightscout.last_uploaded_entry = fake_last_uploaded_entry nightscout.last_uploaded_activity = self.stub_last_uploaded_activity process_time_range(tconnect, nightscout, start, end, pretend=False) self.assertEqual(len(nightscout.uploaded_entries["treatments"]), 2) self.assertDictEqual( nightscout.uploaded_entries, { "treatments": [ NightscoutEntry.basal(0.797, 5.0, "2021-03-16 00:25:21-04:00", reason="algorithmDelivery"), NightscoutEntry.basal(0, 2693 / 60, "2021-03-16 00:30:21-04:00", reason="algorithmDelivery") ] }) self.assertEqual(len(nightscout.put_entries["treatments"]), 1) self.assertDictEqual( dict(nightscout.put_entries), { "treatments": [{ "_id": "nightscout_id", **NightscoutEntry.basal(0.799, 5.0, "2021-03-16 00:20:21-04:00", reason="profileDelivery") }] }) self.assertDictEqual(nightscout.deleted_entries, {})
def test_new_ciq_iob_data(self): tconnect = TConnectApi() # datetimes are unused by the API fake start = datetime.datetime(2021, 4, 20, 12, 0) end = datetime.datetime(2021, 4, 21, 12, 0) tconnect.controliq.therapy_timeline = self.stub_therapy_timeline iobData = TestIOBSync.get_example_csv_iob_events() def fake_therapy_timeline_csv(time_start, time_end): return { **self.stub_therapy_timeline_csv(time_start, time_end), "iobData": iobData, } tconnect.ws2.therapy_timeline_csv = fake_therapy_timeline_csv nightscout = NightscoutApi() nightscout.last_uploaded_entry = self.stub_last_uploaded_entry nightscout.last_uploaded_activity = self.stub_last_uploaded_activity process_time_range(tconnect, nightscout, start, end, pretend=False, features=[BOLUS, BASAL, IOB]) pprint.pprint(nightscout.uploaded_entries) self.assertEqual(len(nightscout.uploaded_entries["activity"]), 1) self.assertDictEqual(dict(nightscout.uploaded_entries), { "activity": [ # the most recent IOB entry is added NightscoutEntry.iob(6.80, "2021-10-12 00:10:30-04:00") ]}) self.assertDictEqual(nightscout.put_entries, {}) self.assertListEqual(nightscout.deleted_entries, [])
def test_new_ws2_activity_events(self): tconnect = TConnectApi() # datetimes are unused by the API fake start = datetime.datetime(2021, 5, 1, 0, 0) end = datetime.datetime(2021, 5, 3, 0, 0) tconnect.controliq.therapy_timeline = self.stub_therapy_timeline tconnect.ws2.therapy_timeline_csv = self.stub_therapy_timeline_csv def fake_basalsuspension(time_start, time_end): self.assertEqual(time_start, start) self.assertEqual(time_end, end) return {"BasalSuspension": [ { 'EventDateTime': '/Date(1638663490000-0000)/', 'SuspendReason': 'site-cart' }, { 'EventDateTime': '/Date(1637863616000-0000)/', 'SuspendReason': 'alarm' }, { 'EventDateTime': '/Date(1638662852000-0000)/', 'SuspendReason': 'manual' } ]} tconnect.ws2.basalsuspension = fake_basalsuspension nightscout = NightscoutApi() nightscout.last_uploaded_entry = self.stub_last_uploaded_entry nightscout.last_uploaded_activity = self.stub_last_uploaded_activity process_time_range(tconnect, nightscout, start, end, pretend=False, features=[PUMP_EVENTS]) self.assertEqual(len(nightscout.uploaded_entries["treatments"]), 3) self.assertDictEqual(dict(nightscout.uploaded_entries), { "treatments": [ NightscoutEntry.sitechange(created_at="2021-12-04 16:18:10-05:00", reason="Site/Cartridge Change"), NightscoutEntry.basalsuspension(created_at="2021-11-25 10:06:56-05:00", reason="Empty Cartridge/Pump Shutdown"), NightscoutEntry.basalsuspension(created_at="2021-12-04 16:07:32-05:00", reason="User Suspended") ]}) self.assertDictEqual(nightscout.put_entries, {}) self.assertListEqual(nightscout.deleted_entries, [])
def test_new_ciq_activity_events(self): tconnect = TConnectApi() # datetimes are unused by the API fake start = datetime.datetime(2021, 5, 1, 0, 0) end = datetime.datetime(2021, 5, 3, 0, 0) def fake_therapy_timeline(time_start, time_end): self.assertEqual(time_start, start) self.assertEqual(time_end, end) return { **TestBasalSync.base, "events": [{ "duration": 1200, "eventType": 2, # Exercise "continuation": None, "timeZoneId": "America/Los_Angeles", "x": 1619901912 # 2021-05-01 13:45:12-04:00 }, { "duration": 30661, "eventType": 1, # Sleep "continuation": None, "timeZoneId": "America/Los_Angeles", "x": 1619992000 # 2021-05-02 14:46:40-04:00 }] } tconnect.controliq.therapy_timeline = fake_therapy_timeline tconnect.ws2.therapy_timeline_csv = self.stub_therapy_timeline_csv tconnect.ws2.basalsuspension = self.stub_ws2_basalsuspension nightscout = NightscoutApi() nightscout.last_uploaded_entry = self.stub_last_uploaded_entry nightscout.last_uploaded_activity = self.stub_last_uploaded_activity process_time_range(tconnect, nightscout, start, end, pretend=False, features=[PUMP_EVENTS]) self.assertEqual(len(nightscout.uploaded_entries["treatments"]), 2) self.assertDictEqual(dict(nightscout.uploaded_entries), { "treatments": [ NightscoutEntry.activity(created_at="2021-05-01 13:45:12-04:00", duration=20, reason="Exercise", event_type=EXERCISE_EVENTTYPE), NightscoutEntry.activity(created_at="2021-05-02 14:46:40-04:00", duration=30661/60, reason="Sleep", event_type=SLEEP_EVENTTYPE), ]}) self.assertDictEqual(nightscout.put_entries, {}) self.assertListEqual(nightscout.deleted_entries, [])
def test_new_ciq_bolus_data(self): tconnect = TConnectApi() start = datetime.datetime(2021, 4, 20, 12, 0) end = datetime.datetime(2021, 4, 21, 12, 0) tconnect.controliq.therapy_timeline = self.stub_therapy_timeline def fake_therapy_timeline_csv(time_start, time_end): return { **self.stub_therapy_timeline_csv(time_start, time_end), "bolusData": TestBolusSync.get_example_csv_bolus_events(), } tconnect.ws2.therapy_timeline_csv = fake_therapy_timeline_csv nightscout = NightscoutApi() nightscout.last_uploaded_entry = self.stub_last_uploaded_entry nightscout.last_uploaded_activity = self.stub_last_uploaded_activity process_time_range(tconnect, nightscout, start, end, pretend=False) pprint.pprint(nightscout.uploaded_entries) self.assertEqual(len(nightscout.uploaded_entries["treatments"]), 3) self.assertDictEqual( dict(nightscout.uploaded_entries), { "treatments": [ NightscoutEntry.bolus(13.53, 75, "2021-04-01 12:58:26-04:00", notes="Standard/Correction"), NightscoutEntry.bolus(1.25, 0, "2021-04-01 23:23:17-04:00", notes="Standard (Override)"), NightscoutEntry.bolus(1.7, 0, "2021-04-02 01:00:47-04:00", notes="Automatic Bolus/Correction"), ] }) self.assertDictEqual(nightscout.put_entries, {}) self.assertDictEqual(nightscout.deleted_entries, {})
def test_iob(self): self.assertEqual( NightscoutEntry.iob(iob=2.05, created_at="2021-03-16 00:25:21-04:00"), { "activityType": "tconnect_iob", "iob": 2.05, "created_at": "2021-03-16 00:25:21-04:00", "enteredBy": "Pump (tconnectsync)" })
def test_basalsuspension(self): self.assertEqual( NightscoutEntry.basalsuspension( created_at="2021-12-05T00:16:35.058Z", reason="reason"), { "eventType": "Basal Suspension", "reason": "reason", "notes": "reason", "created_at": "2021-12-05T00:16:35.058Z", "enteredBy": "Pump (tconnectsync)" })
def test_entry(self): self.assertEqual( NightscoutEntry.entry(sgv=152, created_at="2021-10-23 22:17:14-04:00"), { "type": "sgv", "sgv": 152, "date": 1635041834000, "dateString": "2021-10-23T22:17:14-0400", "device": "Pump (tconnectsync)", })
def test_sitechange(self): self.assertEqual( NightscoutEntry.sitechange(created_at="2021-12-05T00:16:35.058Z", reason="reason"), { "eventType": "Site Change", "reason": "reason", "notes": "reason", "created_at": "2021-12-05T00:16:35.058Z", "enteredBy": "Pump (tconnectsync)" })
def test_new_ciq_bolus_data(self): tconnect = TConnectApi() # datetimes are unused by the API fake start = datetime.datetime(2021, 4, 20, 12, 0) end = datetime.datetime(2021, 4, 21, 12, 0) tconnect.controliq.therapy_timeline = self.stub_therapy_timeline bolusData = TestBolusSync.get_example_csv_bolus_events() def fake_therapy_timeline_csv(time_start, time_end): return { **self.stub_therapy_timeline_csv(time_start, time_end), "bolusData": bolusData, } tconnect.ws2.therapy_timeline_csv = fake_therapy_timeline_csv nightscout = NightscoutApi() nightscout.last_uploaded_entry = self.stub_last_uploaded_entry nightscout.last_uploaded_activity = self.stub_last_uploaded_activity process_time_range(tconnect, nightscout, start, end, pretend=False, features=[BOLUS, BASAL]) pprint.pprint(nightscout.uploaded_entries) self.assertEqual(len(nightscout.uploaded_entries["treatments"]), len(bolusData)) self.assertDictEqual(dict(nightscout.uploaded_entries), { "treatments": [ NightscoutEntry.bolus(13.53, 75, "2021-04-01 12:58:26-04:00", notes="Standard/Correction"), NightscoutEntry.bolus(1.25, 0, "2021-04-01 23:23:17-04:00", notes="Standard (Override)"), NightscoutEntry.bolus(1.7, 0, "2021-04-02 01:00:47-04:00", notes="Automatic Bolus/Correction"), NightscoutEntry.bolus(1.82, 0, "2021-09-06 12:24:47-04:00", notes="Standard/Correction (Terminated by Alarm: requested 2.63 units)"), ]}) self.assertDictEqual(nightscout.put_entries, {}) self.assertListEqual(nightscout.deleted_entries, [])
def test_updates_ciq_iob_data(self): tconnect = TConnectApi() # datetimes are unused by the API fake start = datetime.datetime(2021, 4, 20, 12, 0) end = datetime.datetime(2021, 4, 21, 12, 0) tconnect.controliq.therapy_timeline = self.stub_therapy_timeline iobData = TestIOBSync.get_example_csv_iob_events() iobData[0]["created_at"] = start iobData[0]["_id"] = "sentinel_existing_iob_id" def fake_therapy_timeline_csv(time_start, time_end): return { **self.stub_therapy_timeline_csv(time_start, time_end), "iobData": iobData, } tconnect.ws2.therapy_timeline_csv = fake_therapy_timeline_csv nightscout = NightscoutApi() nightscout.last_uploaded_entry = self.stub_last_uploaded_entry def fake_last_uploaded_activity(activityType): if activityType == IOB_ACTIVITYTYPE: return iobData[0] return self.stub_last_uploaded_activity(activityType) nightscout.last_uploaded_activity = fake_last_uploaded_activity process_time_range(tconnect, nightscout, start, end, pretend=False, features=[IOB]) pprint.pprint(nightscout.uploaded_entries) self.assertEqual(len(nightscout.uploaded_entries["activity"]), 1) self.assertDictEqual(dict(nightscout.uploaded_entries), { "activity": [ # the most recent IOB entry is added NightscoutEntry.iob(6.80, "2021-10-12 00:10:30-04:00") ]}) self.assertDictEqual(nightscout.put_entries, {}) self.assertListEqual(nightscout.deleted_entries, [ "activity/sentinel_existing_iob_id" ])
def test_existing_ciq_activity_events(self): tconnect = TConnectApi() # datetimes are unused by the API fake start = datetime.datetime(2021, 5, 1, 0, 0) end = datetime.datetime(2021, 5, 3, 0, 0) def fake_therapy_timeline(time_start, time_end): self.assertEqual(time_start, start) self.assertEqual(time_end, end) return { **TestBasalSync.base, "events": [{ "duration": 1200, "eventType": 2, # Exercise "continuation": None, "timeZoneId": "America/Los_Angeles", "x": 1619901912 # 2021-05-01 13:45:12-04:00 }, { "duration": 4200, # Currently 60 mins (3600), changing to 70 mins (4200) "eventType": 1, # Sleep "continuation": None, "timeZoneId": "America/Los_Angeles", "x": 1619992000 # 2021-05-02 14:46:40-04:00 }] } tconnect.controliq.therapy_timeline = fake_therapy_timeline tconnect.ws2.therapy_timeline_csv = self.stub_therapy_timeline_csv tconnect.ws2.basalsuspension = self.stub_ws2_basalsuspension nightscout = NightscoutApi() def fake_last_uploaded_entry(event_type): if event_type == "Sleep": return { "created_at": "2021-05-02 14:46:40-04:00", "duration": 60, "_id": "old_sleep" } elif event_type == "Exercise": return { "created_at": "2021-05-01 13:45:12-04:00", "duration": 20, "_id": "exercise" } return self.stub_last_uploaded_entry() nightscout.last_uploaded_entry = fake_last_uploaded_entry nightscout.last_uploaded_activity = self.stub_last_uploaded_activity process_time_range(tconnect, nightscout, start, end, pretend=False, features=[PUMP_EVENTS]) self.assertEqual(len(nightscout.uploaded_entries["treatments"]), 1) self.assertDictEqual(dict(nightscout.uploaded_entries), { "treatments": [ # Already exists: # NightscoutEntry.activity(created_at="2021-05-01 13:45:12-04:00", duration=20, reason="Exercise", event_type=EXERCISE_EVENTTYPE), # Updated event duration: NightscoutEntry.activity(created_at="2021-05-02 14:46:40-04:00", duration=70, reason="Sleep", event_type=SLEEP_EVENTTYPE), ]}) self.assertDictEqual(nightscout.put_entries, {}) self.assertEqual(len(nightscout.deleted_entries), 1) self.assertListEqual(nightscout.deleted_entries, [ "treatments/old_sleep" ])