Only zero is empty, and the last day is worth reading

This commit is contained in:
2026-08-21 11:57:17 -04:00
parent bbda5cbfe9
commit 74392ccad2
7 changed files with 317 additions and 57 deletions

View File

@@ -8,6 +8,8 @@ purchasing decision.
from datetime import datetime, timedelta, timezone
import pytest
from plugins.printers.services.supply_history import (
analyse, band, burn_rate, current_run, find_replacements, normalise,
orderlist, soonest,
@@ -113,28 +115,69 @@ def test_live_level_drives_the_countdown_not_the_stored_one():
assert result['daysleft'] == 1 # 20 / 20, not 40 / 20
def test_a_nearly_empty_cartridge_reads_as_empty_not_as_weeks_away():
"""1% draining a tenth of a point a day computes to ten days. It is out."""
result = analyse(series([2.0, 1.7, 1.4, 1.1]), currentlevel=1)
def test_a_nearly_empty_cartridge_keeps_its_real_countdown():
"""Only zero is empty.
This used to floor everything at or below 5% to daysleft 0, so 1% draining
a tenth of a point a day was reported as gone. It has ten days in it, and
ten days is the only thing the row exists to say. Flooring it put the
cartridge beside ones that genuinely are empty with no way back to the
difference.
"""
# 3.0 down to 1.0 at a tenth of a point a day: a real, slow, measured drop.
slow = [round(3.0 - 0.1 * i, 2) for i in range(21)]
result = analyse(series(slow), currentlevel=1)
assert result['daysleft'] == pytest.approx(10, abs=0.1)
def test_a_cartridge_with_hours_left_is_not_reported_as_empty():
"""The other half of the floor: int() truncated the division, so anything
under a full day became 0 and read as empty. A cartridge with six hours in
it still prints."""
result = analyse(series([100, 75, 50, 25]), currentlevel=6)
assert 0 < result['daysleft'] < 1
assert round(result['daysleft'] * 24) == 6
def test_an_actual_zero_is_still_empty():
"""The half that must not regress. Zero means spent, and spent is ordered
first."""
result = analyse(series([2.0, 1.7, 1.4, 1.1]), currentlevel=0)
assert result['daysleft'] == 0
def test_empty_sorts_ahead_of_a_fast_healthy_cartridge():
empty = analyse(series([2.0, 1.7, 1.4, 1.1]), currentlevel=1)
empty = analyse(series([2.0, 1.7, 1.4, 1.1]), currentlevel=0)
healthy = analyse(series([100, 80, 60, 40]))
assert empty['daysleft'] < healthy['daysleft']
def test_a_low_live_level_is_actionable_without_any_history():
def test_an_empty_live_level_is_actionable_without_any_history():
"""A printer new to Zabbix still reports it is out of toner."""
result = analyse([], currentlevel=1)
result = analyse([], currentlevel=0)
assert result['daysleft'] == 0
assert result['reason'] is None
def test_a_low_live_level_with_no_history_cannot_be_counted_down():
"""A rate needs two readings. At 1% with none, there is nothing to divide.
Previously the 5% floor answered this by asserting daysleft 0, which was
right by accident and wrong in general - it said "empty" about a level
nobody had watched move. It reports no estimate and says why; the report
lists it under "No estimate yet" rather than on the order list.
"""
result = analyse([], currentlevel=1)
assert result['daysleft'] is None
assert result['reason'] == 'no history'
def test_no_history_and_a_healthy_level_still_says_no_history():
result = analyse([], currentlevel=80)