Zeitraum im Kartenkopf; Verlauf feiner als ein Punkt pro Tag
Zeitraum-Auswahl: Sie stand ueber dem Diagramm und nahm ihm Hoehe weg. Jetzt sitzt sie klein im Kartenkopf neben dem Titel - die ganze Kartenhoehe gehoert dem Diagramm. Die Wahl wird in der Anordnung mitgespeichert, bleibt also nach dem Neuladen erhalten; ausserhalb des Bearbeitungsmodus geschieht das still im Hintergrund. Feinere Aufloesung: Ein Punkt je Tag verbarg, WANN ein- und ausgelagert wurde. Die Abtastrate richtet sich jetzt nach dem Zeitraum: bis 2 Tage -> stuendlich bis 14 Tage -> alle 6 Stunden bis 120 Tage -> taeglich darueber -> woechentlich So bleibt die Punktzahl immer zwischen etwa 25 und 105 - fein genug zum Erkennen, grob genug zum Zeichnen. Ein Test haelt diese Spanne fest. Die Zeitachse traegt entsprechend Uhrzeit statt Datum, wenn stuendlich abgetastet wird. Punkte heissen jetzt "at" (Zeitpunkt) statt "date". Zeitstempel aus SQLite kommen ohne Zeitzone zurueck und werden vereinheitlicht, sonst schluege die Differenzbildung fehl. Auswahl erweitert: 24 Stunden, 2 Tage, 7, 30, 90 Tage, 6 Monate, 1 Jahr. Geprueft: "npm run build" laeuft durch. pytest weiterhin nicht ausfuehrbar - kein Python auf diesem Rechner; die Tests wurden an die neue Aufloesung angepasst. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
from datetime import date, timedelta
|
||||
from datetime import date, timedelta # noqa: F401 (date fuer die Zustands-Tests)
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -90,19 +90,34 @@ def test_by_category_bündelt_und_sortiert(db, user):
|
||||
|
||||
|
||||
# ----------------------------------------------------------------- Verlauf
|
||||
def test_schrittweite_haengt_am_zeitraum():
|
||||
"""Kurze Zeitraeume werden fein abgetastet, lange grob."""
|
||||
assert dashboard._schrittweite(1) == timedelta(hours=1)
|
||||
assert dashboard._schrittweite(2) == timedelta(hours=1)
|
||||
assert dashboard._schrittweite(7) == timedelta(hours=6)
|
||||
assert dashboard._schrittweite(90) == timedelta(days=1)
|
||||
assert dashboard._schrittweite(365) == timedelta(days=7)
|
||||
|
||||
|
||||
def test_schrittweite_haelt_die_punktzahl_im_rahmen():
|
||||
"""Egal welcher Zeitraum – die Kurve bleibt zeichenbar."""
|
||||
for tage in (1, 2, 7, 14, 30, 90, 180, 365, 730):
|
||||
anzahl = timedelta(days=tage) / dashboard._schrittweite(tage)
|
||||
assert 20 <= anzahl <= 180, f"{tage} Tage ergeben {anzahl} Punkte"
|
||||
|
||||
|
||||
def test_timeline_rechnet_bewegungen_zurueck(db, rice, user):
|
||||
"""Der Verlauf entsteht rueckwaerts aus dem heutigen Bestand."""
|
||||
check_in(db, rice, 4, "package", None, None, user) # +4 Einheiten heute
|
||||
check_out(db, rice, 1, "package", user) # -1 Einheit heute
|
||||
check_in(db, rice, 4, "package", None, None, user) # +4 Einheiten jetzt
|
||||
check_out(db, rice, 1, "package", user) # -1 Einheit jetzt
|
||||
db.commit()
|
||||
|
||||
punkte = dashboard.timeline(days=3, product_id=None, db=db, _=user)
|
||||
assert len(punkte) == 3
|
||||
# Heute: 3 Einheiten; die Tage davor lag nichts im Lager.
|
||||
assert punkte[-1].date == date.today()
|
||||
# Jetzt 3 Einheiten; vor dem Einlagern war das Lager leer.
|
||||
assert punkte[-1].article_units == 3
|
||||
assert punkte[0].article_units == 0
|
||||
assert punkte[1].article_units == 0
|
||||
# Aufsteigend sortiert, damit die Linie von links nach rechts laeuft.
|
||||
assert punkte[0].at < punkte[-1].at
|
||||
|
||||
|
||||
def test_timeline_kann_auf_ein_produkt_eingegrenzt_werden(db, rice, user):
|
||||
@@ -125,12 +140,13 @@ def test_activity_zaehlt_ein_und_auslagerungen(db, rice, user):
|
||||
check_out(db, rice, 1, "package", user)
|
||||
db.commit()
|
||||
|
||||
tage = dashboard.activity(days=3, db=db, _=user)
|
||||
assert len(tage) == 3
|
||||
heute = tage[-1]
|
||||
assert heute.date == date.today()
|
||||
assert heute.checked_in == 2
|
||||
assert heute.checked_out == 1
|
||||
abschnitte = dashboard.activity(days=3, db=db, _=user)
|
||||
# Alles gerade eben passiert -> liegt im juengsten Abschnitt.
|
||||
juengster = abschnitte[-1]
|
||||
assert juengster.checked_in == 2
|
||||
assert juengster.checked_out == 1
|
||||
assert sum(a.checked_in for a in abschnitte) == 2
|
||||
assert abschnitte[0].at < juengster.at
|
||||
|
||||
|
||||
# ---------------------------------------------------------------- Anordnung
|
||||
|
||||
Reference in New Issue
Block a user