Skip to content

Commit

Permalink
Added basic client and more tests
Browse files Browse the repository at this point in the history
  • Loading branch information
PTST committed Feb 22, 2024
1 parent 6ff05bc commit 99f4b27
Show file tree
Hide file tree
Showing 11 changed files with 156 additions and 20 deletions.
13 changes: 13 additions & 0 deletions LibreView/LibreView.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from typing import List
from LibreView.models import Connection
from LibreView.utils import API


class LibreView:
client: API

def __init__(self, username: str, password: str):
self.client = API(username, password)

def get_connections(self) -> List[Connection]:
return self.client.get_connections()
2 changes: 1 addition & 1 deletion LibreView/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
from LibreView.utils import *
from LibreView.LibreView import LibreView
4 changes: 3 additions & 1 deletion LibreView/models/Connection.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
from dataclasses import dataclass
from uuid import UUID
from dataclass_wizard import JSONWizard
from LibreView.models.Sensor import Sensor

# from LibreView.models import Sensor, GlucoseMeasurement
from LibreView.models.GlucoseMeasurement import GlucoseMeasurement
from LibreView.models.Sensor import Sensor


@dataclass
Expand Down
7 changes: 2 additions & 5 deletions LibreView/models/GlucoseMeasurement.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

@dataclass
class GlucoseMeasurement(JSONWizard):
_timestamp: str
type: int
value_in_mg_per_dl: int
trend_arrow: int
Expand All @@ -15,19 +14,17 @@ class GlucoseMeasurement(JSONWizard):
is_high: bool
is_low: bool
_factory_timestamp: str = json_field("FactoryTimestamp") # type: ignore
_timestamp: str = json_field("Timestamp") # type: ignore
trend_message: str | None = None

@property
def factory_timestamp(self) -> datetime:
return self.parse_dt(self._factory_timestamp)

_timestamp: str = json_field("Timestamp") # type: ignore

@property
def timestamp(self) -> datetime:
return self.parse_dt(self._timestamp)

trend_message: str | None = None

def parse_dt(self, val: str) -> datetime:
splitted = val.split("/")
splitted[0] = splitted[0].zfill(2)
Expand Down
3 changes: 1 addition & 2 deletions LibreView/models/User.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
from typing import Any, List, Dict
from uuid import UUID
from dataclass_wizard import JSONWizard
from LibreView.models.Device import Device
from LibreView.models.Practice import Practice
from LibreView.models import Device, Practice


@dataclass
Expand Down
6 changes: 6 additions & 0 deletions LibreView/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from LibreView.models.Connection import Connection
from LibreView.models.Device import Device
from LibreView.models.GlucoseMeasurement import GlucoseMeasurement
from LibreView.models.Practice import Practice
from LibreView.models.Sensor import Sensor
from LibreView.models.User import User
3 changes: 1 addition & 2 deletions LibreView/utils/API.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from typing import List
import requests
from LibreView.models.User import User
from LibreView.models.Connection import Connection
from LibreView.models import User, Connection


def reauth_on_fail(func):
Expand Down
2 changes: 1 addition & 1 deletion LibreView/utils/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
from .API import API
from LibreView.utils.API import API
84 changes: 77 additions & 7 deletions Tests/test_api.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from datetime import datetime
import os
from uuid import UUID
import LibreView
from LibreView.models import Connection, Device, GlucoseMeasurement, Practice, Sensor
from LibreView.utils.API import API
import logging

LOGGER = logging.getLogger(__name__)
Expand All @@ -10,22 +11,91 @@


def test_logon():
api = LibreView.API(USERNAME, PASSWORD)
api = API(USERNAME, PASSWORD)
assert api.client.headers.get("Authorization") != None


def test_get_user():
api = LibreView.API(USERNAME, PASSWORD)
api = API(USERNAME, PASSWORD)
usr = api.get_user()
assert isinstance(usr.id, UUID)
assert isinstance(usr.first_name, str)
assert len(usr.first_name) > 0
assert isinstance(usr.last_name, str)
assert isinstance(usr.email, str)
assert isinstance(usr.country, str)
assert isinstance(usr.ui_language, str)
assert isinstance(usr.communication_language, str)
assert isinstance(usr.account_type, str)
assert isinstance(usr.uom, int)
assert isinstance(usr.date_format, int)
assert isinstance(usr.time_format, int)
assert isinstance(usr.email_day, list)
assert isinstance(usr.created, int)
assert isinstance(usr.last_login, int)
assert isinstance(usr.date_of_birth, int)
assert isinstance(usr.practices, dict)
assert isinstance(usr.devices, dict)

for key, practice in usr.practices.items():
assert isinstance(key, UUID)
assert isinstance(practice, Practice)
assert isinstance(practice.id, UUID)
assert isinstance(practice.practice_id, str)
assert isinstance(practice.name, str)
assert isinstance(practice.address1, str)
assert isinstance(practice.city, str)
assert isinstance(practice.state, str)
assert isinstance(practice.zip, str)
assert isinstance(practice.phone_number, str)
assert isinstance(practice.address2, str) or practice.address2 is None

for key, device in usr.devices.items():
assert isinstance(key, str)
assert isinstance(device, Device)
assert isinstance(device.id, UUID)
assert isinstance(device.nickname, str)
assert isinstance(device.sn, UUID)
assert isinstance(device.type, int)
assert isinstance(device.upload_date, int)


def test_get_connections():
api = LibreView.API(USERNAME, PASSWORD)
api = API(USERNAME, PASSWORD)
cons = api.get_connections()
assert len(cons) > 0
con = cons[0]
assert isinstance(con, Connection)
assert isinstance(con.id, UUID)
assert isinstance(con.patient_id, UUID)
assert isinstance(con.glucose_measurement.timestamp, datetime)
assert len(con.first_name) > 0
assert isinstance(con.country, str)
assert isinstance(con.status, int)
assert isinstance(con.first_name, str)
assert isinstance(con.last_name, str)
assert isinstance(con.target_low, int)
assert isinstance(con.target_high, int)
assert isinstance(con.uom, int)

assert isinstance(con.sensor, Sensor)
assert isinstance(con.glucose_measurement, GlucoseMeasurement)

sensor = con.sensor
assert isinstance(sensor.device_id, str)
assert isinstance(sensor.sn, str)
assert isinstance(sensor.a, int)
assert isinstance(sensor.w, int)
assert isinstance(sensor.pt, int)
assert isinstance(sensor.s, bool)
assert isinstance(sensor.lj, bool)

gm = con.glucose_measurement
assert isinstance(gm.type, int)
assert isinstance(gm.value_in_mg_per_dl, int)
assert isinstance(gm.trend_arrow, int)
assert isinstance(gm.measurement_color, int)
assert isinstance(gm.glucose_units, int)
assert isinstance(gm.value, float)
assert isinstance(gm.is_high, bool)
assert isinstance(gm.is_low, bool)
assert isinstance(gm.factory_timestamp, datetime)
assert isinstance(gm.timestamp, datetime)
assert isinstance(gm.trend_message, str) or gm.trend_message is None
50 changes: 50 additions & 0 deletions Tests/test_client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from datetime import datetime
import os
from uuid import UUID
from LibreView import LibreView
from LibreView.models import Connection, GlucoseMeasurement, Sensor

USERNAME: str = os.environ["libre_username"]
PASSWORD: str = os.environ["libre_password"]


def test_connections():
libre = LibreView(USERNAME, PASSWORD)
cons = libre.get_connections()
assert len(cons) > 0
con = cons[0]
assert isinstance(con, Connection)
assert isinstance(con.id, UUID)
assert isinstance(con.patient_id, UUID)
assert isinstance(con.country, str)
assert isinstance(con.status, int)
assert isinstance(con.first_name, str)
assert isinstance(con.last_name, str)
assert isinstance(con.target_low, int)
assert isinstance(con.target_high, int)
assert isinstance(con.uom, int)

assert isinstance(con.sensor, Sensor)
assert isinstance(con.glucose_measurement, GlucoseMeasurement)

sensor = con.sensor
assert isinstance(sensor.device_id, str)
assert isinstance(sensor.sn, str)
assert isinstance(sensor.a, int)
assert isinstance(sensor.w, int)
assert isinstance(sensor.pt, int)
assert isinstance(sensor.s, bool)
assert isinstance(sensor.lj, bool)

gm = con.glucose_measurement
assert isinstance(gm.type, int)
assert isinstance(gm.value_in_mg_per_dl, int)
assert isinstance(gm.trend_arrow, int)
assert isinstance(gm.measurement_color, int)
assert isinstance(gm.glucose_units, int)
assert isinstance(gm.value, float)
assert isinstance(gm.is_high, bool)
assert isinstance(gm.is_low, bool)
assert isinstance(gm.factory_timestamp, datetime)
assert isinstance(gm.timestamp, datetime)
assert isinstance(gm.trend_message, str) or gm.trend_message is None
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

setuptools.setup(
name="LibreView",
version="0.0.1",
version="0.0.5",
author="PTST",
author_email="patrick@steffensen.io",
description="API interface for LibreView / LibreLinkUp glucose readings",
Expand Down

0 comments on commit 99f4b27

Please sign in to comment.