From f6fd13043e73ebf5a632310ad791f702a7073175 Mon Sep 17 00:00:00 2001 From: Colin Goutte Date: Fri, 12 Nov 2021 17:33:55 +0100 Subject: [PATCH] Better count --- Makefile | 2 +- papi/main.py | 103 ++++++++++++++++++++++---------------------- papi/sqlapp/crud.py | 4 ++ tests/test_papi.py | 36 ++++++++++++++-- 4 files changed, 88 insertions(+), 57 deletions(-) diff --git a/Makefile b/Makefile index ee6e997..174fe60 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ test: cleandb .ONESHELL: dtest: cleandb - poetry run pytest -s --pdb --cov=. --cov-report=term-missing:skip-covered . + poetry run pytest -s --ff --lf --pdb --cov=. --cov-report=term-missing:skip-covered . .ONESHELL: qtest: cleandb diff --git a/papi/main.py b/papi/main.py index dd04deb..d909461 100644 --- a/papi/main.py +++ b/papi/main.py @@ -49,7 +49,6 @@ def sondeid2notifsemails(idsonde, mapping=None): if mapping is None: mapping = PROBES try: - breakpoint() section = mapping[idsonde] except KeyError: # pragma: no cover raise KeyError(f"{idsonde} non trouvé dans {list(mapping.keys())}") @@ -78,9 +77,6 @@ def atomic_db(): db.close() -sondes = {"test": schemas.SondeBase(identifiant="test", nom="Testlocal")} - - def apply_config(configs: list[dict] = []): with atomic_db() as db: for config in configs: @@ -102,8 +98,8 @@ apply_config(configurations) class Notifier: @staticmethod - def __call__(idsonde, changes): - status = get_rapport(idsonde) + def __call__(db, idsonde, changes): + status = get_rapport(idsonde, db) notifications[idsonde].append( {"changes": changes, "status": [x for x in status]} ) @@ -138,10 +134,6 @@ class Notifier: Notifier = Notifier() -for k, sonde in PROBES.items(): - sondes[k] = schemas.SondeBase( - identifiant=sonde["identifiant_sonde"], nom=sonde["nom_sonde"] - ) def default_sample(): @@ -154,22 +146,22 @@ def read_root(): return {"msg": "Hello World"} -@app.post("/sonde/", response_model=List[schemas.SondeBase]) +@app.post("/sonde/", response_model=schemas.SondeBase) def post_sonde(sonde: schemas.SondeBase, db: Session = Depends(get_db)): db_sonde = crud.get_sonde(db, identifiant=sonde.identifiant) if not db_sonde: db_sonde = crud.create_sonde( db, sonde.identifiant, sonde.nom or sonde.identifiant ) - sondes[sonde.identifiant] = schemas.SondeBase.from_orm( - db_sonde - ) # Attention au typage ici - return list(sondes.values()) + # sondes[sonde.identifiant] = schemas.SondeBase.from_orm( + # db_sonde + # ) # Attention au typage ici + return schemas.SondeBase.from_orm(db_sonde) @app.get("/sonde/", response_model=List[schemas.SondeBase]) -def list_sonde(): - return [x for x in sondes.values()] +def list_sonde(db: Session = Depends(get_db)): + return crud.list_sonde(db) @app.get("/notifications/{idsonde}") @@ -218,7 +210,7 @@ def post_sonde_error( ): if not (sonde := crud.get_sonde(db, idsonde)): if idsonde != "test": - return # pragma: no cover + raise LookupError(f"{idsonde} not found") Notifier.error_sonde(idsonde, body["msg"]) @@ -251,18 +243,18 @@ def post_sonde_data( db: Session = Depends(get_db), ): if not (sonde := crud.get_sonde(db, idsonde)): + raise LookupError(f"{idsonde} not found") return - mesures_ = [x for x in sonde.mesures] - if not mesures_: - mesures_.append( - crud.create_mesure(db, sonde.sonde_id, content=default_sample()) - ) - mesures_.append(crud.create_mesure(db, sonde.sonde_id, content=body)) - mesures[idsonde] = mesures_ + if not sonde.mesures: + crud.create_mesure(db, sonde.sonde_id, content=default_sample()) + crud.create_mesure(db, sonde.sonde_id, content=body) + + last_two = crud.get_mesure(db, sonde_id=sonde.sonde_id, only_last=2) date = body["date"] - previous = utils.prepare(mesures_[-2].content) - present = utils.prepare(mesures_[-1].content) + + previous = utils.prepare(last_two[-2].content) + present = utils.prepare(last_two[-1].content) all_channels = sorted(set((*previous["channels"], *present["channels"]))) diff = utils.compare(all_channels, previous, present) @@ -273,42 +265,49 @@ def post_sonde_data( else "" ) if content: - Notifier(idsonde, content) + Notifier(db, idsonde, content) res = last_notif_text(request, idsonde) html = res.body.decode("utf-8") from papi.mail_sendermodel import sendmail - conf = PROBES[idsonde] - sumup = utils.sample2statuscount(present) - subject = " ; ".join(sumup) - sendmail( - htmlpart=html, - emails=conf["emails"], - subject=subject, - ) + if idsonde in PROBES: + conf = PROBES[idsonde] + sumup = utils.sample2statuscount(present) + subject = " ; ".join(sumup) + sendmail( + htmlpart=html, + emails=conf["emails"], + subject=subject, + ) + cnt = crud.get_mesure(db, sonde_id=sonde.sonde_id) + offset = 0 if "date" in cnt[0].content else 1 return { - "count": len(mesures_) - if "date" in mesures_[0].content.keys() - else len(mesures_) - 1, + "count": len(crud.get_mesure(db, sonde_id=sonde.sonde_id)) - offset, "notify": content, } -@app.get("/sonde/{idsonde}/rapport") -def get_rapport(idsonde): - try: - last = mesures[idsonde][-1] - except IndexError: - return - else: - last = last.content - last = utils.prepare(last) +@app.get("/mesures/{idsonde}/") +def list_sonde_mesures(idsonde, db: Session = Depends(get_db)): + if not (sonde := crud.get_sonde(db, idsonde)): + raise LookupError(f"{idsonde} not found") + return [x for x in sonde.mesures if "date" in x.content] - for name, data in sorted( - last["channels"].items(), key=lambda text: float(text[0].split("#")[0]) - ): - yield f'{name.split("#", 1)[1]} {data["status"]}' + +@app.get("/sonde/{idsonde}/rapport") +def get_rapport(idsonde, db: Session = Depends(get_db)): + if not (sonde := crud.get_sonde(db, idsonde)): + raise LookupError + + last = crud.get_mesure(db, sonde_id=sonde.sonde_id, only_last=1)[0] + last = last.content + last = utils.prepare(last) + + for name, data in sorted( + last["channels"].items(), key=lambda text: float(text[0].split("#")[0]) + ): + yield f'{name.split("#", 1)[1]} {data["status"]}' @app.get("/sonde/{idsonde}/historique") diff --git a/papi/sqlapp/crud.py b/papi/sqlapp/crud.py index 19bebbf..cb847d0 100644 --- a/papi/sqlapp/crud.py +++ b/papi/sqlapp/crud.py @@ -9,6 +9,10 @@ def get_sonde(db: Session, identifiant: str): return q.first() +def list_sonde(db: Session): + return db.query(models.Sonde).all() + + def create_sonde(db: Session, identifiant: str, nom: str): db_sonde = models.Sonde(identifiant=identifiant, nom=nom) db.add(db_sonde) diff --git a/tests/test_papi.py b/tests/test_papi.py index 5395420..4c52084 100644 --- a/tests/test_papi.py +++ b/tests/test_papi.py @@ -7,7 +7,6 @@ from fastapi.testclient import TestClient from papi.main import app, get_db -from papi.main import sondes import papi.main from papi import main @@ -44,10 +43,32 @@ app.dependency_overrides[get_db] = override_get_db client = TestClient(app) +probes_fixture = [ + # {"identifiant": "masonde_1", "nom": "client1"}, + # {"identifiant": "masonde_001", "nom": "client1"}, + # {"identifiant": "masonde_histo", "nom": "client_histo"}, +] +posted = [] + + +def setup(): + for probe_data in probes_fixture: + data = tuple(probe_data.items()) + # breakpoint() + if data not in posted: + # response = client.post("/sonde/", json=probe_data) + # assert response.ok + # posted.append(data) + pass + + def test_version(): assert __version__ == "0.1.0" +# setup() + + def test_read_main(): response = client.get("/") assert response.status_code == 200 @@ -55,10 +76,13 @@ def test_read_main(): def test_creer_sonde(): + sonde1 = {"identifiant": "masonde_001", "nom": "client1"} response = client.post("/sonde/", json=sonde1) assert response.status_code == 200 - assert sonde1 in sondes.values() + # FIXME: test code + # breakpoint() + # assert sonde1 in sondes.values() def test_lister_sondes(): @@ -72,13 +96,17 @@ def test_post_data(): id_ = "masonde_001" from papi.main import mesures - curlen = len(mesures[id_]) + curlen = len(client.get(f"mesures/{id_}/").json()) data = testutils.probe_sample_body() response = client.post(f"/sonde/{id_}/", json=data) assert response.status_code == 200 - assert response.json()["count"] == curlen + 1 + assert ( + response.json()["count"] + == curlen + 1 + == len(client.get(f"mesures/{id_}/").json()) + ) def test_sample_report():